簡體   English   中英

關於從2D數組創建排名路徑列表,我需要了解什么?

[英]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。

我可以匯總所有可能的路線並從那里確定,但是內部數組的大小可能比所示的大得多。

我花了一些時間思考它,並進行了研究。 我唯一能看到的是匈牙利算法,但它現在已經超出了我的數學/綜合知識。 在這種情況下,那將是最適用的知識嗎? 它似乎可以滿足一條路線的最低“成本”,但我需要相反的選擇。

我的想法,至少作為一個想法:

  1. 在每個內部數組中提取最高編號,從中創建新數組。 對此排名[0]。
  2. 比較每個內部陣列中的最高編號與第二最低的編號。 訂購每個之間的差異。
  3. 從內部數組中刪除編號為2的最低差的最高編號。
  4. 重復#1至#3。

在上面的示例中,我期望以下內容。

[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM