[英]How do I find and remove an object from an array based on what I know about the contents of that object?
[英]What do I need to know about creating a list of ranked pathways from 2D array?
假設我有一個設備矩陣和它們的統計信息。 帽子,襯衫,褲子,靴子。 每個內部數組的大小都可以變化,但是總是會有一定數量的內部數組-在這種情況下為4。
var array = [
[1,9,2,8,3], // hat
[2,8,3,6], // shirt
[1,3], // pants
[9,3,2,6,8,2,1,5,2] // boots
]
我想找到通過矩陣的最佳路徑,然后以使確定的下一條路線(因而是該路線的總和)是第一條路線中的第二條最佳路線的方式刪除項目。 在此示例中, [9, 8, 3, 9]
最好,對嗎? 因此,我們可以在[0]中刪除9
以達到8
從而僅減少1。
我可以匯總所有可能的路線並從那里確定,但是內部數組的大小可能比所示的大得多。
我花了一些時間思考它,並進行了研究。 我唯一能看到的是匈牙利算法,但它現在已經超出了我的數學/綜合知識。 在這種情況下,那將是最適用的知識嗎? 它似乎可以滿足一條路線的最低“成本”,但我需要相反的選擇。
我的想法,至少作為一個想法:
在上面的示例中,我期望以下內容。
[9, 8, 3, 9]
[8, 8, 3, 9]
[8, 8, 3, 8]
[8, 6, 3, 8]
[8, 6, 3, 6]
[8, 6, 3, 5]
編輯:我想我已經解釋了這個問題,讓我修復一下。
EDIT2:從本質上講,是最小損失的集合,僅從一個內部數組中除去一項。
更新 :我最初誤解了您的問題。 您隨后澄清了這個問題,在此我提供了一個全新的解決方案。
我使用的策略是將所有子數組中的所有元素展平為單個數組,但是這樣做要記住它們來自哪個原始子數組。 然后,我對展平的數組進行排序,首先按值降序排序,然后按子數組編號升序排序。 例如,排序的展平數組的前3個元素將是[[9,0],[9,3],[8,0],...],表示子數組0中的值9,然后是值9從子數組3開始,然后從子數組0開始,取值為8,依此類推。然后,我遍歷該列表,並根據需要獲取盡可能多的值,直到達到n,但為尚未使用的任何子數組留出空間選擇一個值。
請注意,此解決方案適用於任意數量的子數組,每個子數組具有任意數量的元素。
const array = [ [1,9,2,8,3], // hat [2,8,3,6], // shirt [1,3], // pants [9,3,2,6,8,2,1,5,2] // boots ]; for (let n = 0; n < 17; n += 1) { const valuesChosen = getTopNBest(array, n); console.log(`n = ${n}: ${JSON.stringify(valuesChosen)}`); } function getTopNBest(array, n) { const numTypes = array.length; const allElmtsRanked = []; array.forEach((sub, typeNum) => { sub.forEach(elmt => {allElmtsRanked.push([elmt, typeNum]);}); }); allElmtsRanked.sort((a,b) => b[0] - a[0] !== 0 ? b[0] - a[0] : a[1] - b[1]); const valuesChosen = array.map(() => null); let totalNumValuesExamined = 0; let numSecondaryValuesChosen = 0; let numUnrepresentedTypes = numTypes; let currPair, currValue, currTypeNum; while (numUnrepresentedTypes !== 0 || numSecondaryValuesChosen < n) { currPair = allElmtsRanked[totalNumValuesExamined]; currValue = currPair[0]; currTypeNum = currPair[1]; totalNumValuesExamined += 1; if (valuesChosen[currTypeNum] === null) { valuesChosen[currTypeNum] = currValue; numUnrepresentedTypes -= 1; } else if (numSecondaryValuesChosen < n) { numSecondaryValuesChosen += 1; valuesChosen[currTypeNum] = currValue; } } return valuesChosen; }
隨后,您問為什么我先按值然后按子數組號排序。 比較以下兩種情況:
var array = [
[8],
[9,9,9,9,9],
[8],
[8]
]
...與...
var array = [
[9,8],
[9,9],
[9,8],
[9,8]
]
如果僅對這些扁平化的數組進行扁平化,而又不保留有關值來自哪個子數組的任何信息,則在兩種情況下,最終都會得到相同的扁平化數組,即
var sortedFlattenedArray = [9,9,9,9,9,8,8,8]
假設您想要最好/最理想的途徑。 現在,無論哪種情況,您都將得到[9,9,9,9]
,而第一種情況下,您確實需要[8,9,8,8]
。 僅在記住子數組/類型編號后才能獲取此信息,例如:
var sortedFlattenedArray = [[9,1],[9,1],[9,1],[9,1],[9,1],[8,0],[8,2],[8,3]]
因此,當您不再需要任何類型的更多次優值,但仍在尋找特定值的最大可能值時,實際策略可以讓您忽略已采樣類型的合理高但次優值類型。
這是另一種查看方式。 這里的策略使您可以對所有原始數組進行展平和排序, 但要記住每個元素的來源 。 反過來,這可以讓您在選擇路徑時保持選擇性,說:“啊,下一個值很高,這很好,但是請耐心等待,因為它是一頂帽子(您只能通過讀取它的關聯子項來知道-陣列/型號),我已經取回我的“次優值”配額,所以我會忽略這個帽子值,但是,我會繼續通過分揀扁平陣列遷移到找到一個最高的剩余價值襯衫(同樣,您只能通過讀取其關聯的子數組/類型編號來發現它),但我仍沒有找到任何價值。”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.