簡體   English   中英

需要編寫一種算法,以便從每個數組2值的數組1值中獲取值的總和

[英]Need to write an algorithm for getting sum of values from Array 1 values for each Array 2 value

我正在創建一種算法,以將第二個數組中優先級高的第一個數組的單元格的任何組合與第二個數組值進行匹配。 例如在javascript中:

var arr=[10,20,30,40,50,60,70,80,90];
var arr2=[100,120,140];

我想要的是自動定義為以下邏輯(串行第二個數組的單元格的值優先),請幫助我找到算法的偽

100 = 10+20+30+40 //arr2[0] = arr1[0] + arr1[1] + arr1[2] + arr1[3]
120 = 50+70 //arr2[1] = arr1[4] + arr1[6]
140 = 60+80 //arr2[2] = arr1[5] + arr1[7]
90 = 90  //remaining arr1[8]

值是演示值,可以動態更改。

如果將兩個數組都作為已排序的數組,然后從第一個數組(array1)的最后端開始添加元素(當數組被排序時最大),則可能有解決方案,現在檢查sum是否匹配,然后繼續進行,否則sum如果小於array2中的元素您正在檢查,然后需要從array1添加第三個元素。 另一種情況是,如果sum大於array2中的元素,那么您必須忽略array1中您另外使用的元素中的一個,並將加法替換為HV從數組one中使用的前一個元素。 重復這些步驟。 您需要考慮如何正確執行此操作,否則您需要分享一些工作或邏輯思維,以便我們可以提供幫助

由於問題很復雜,除了偽代碼樣式的說明已經足夠了,我還編寫了一個實際的實現,您可以在此鏈接上找到。

我建議您不要着眼於解決方案,而是先嘗試自己實現算法,因為還有很多需要進一步改進的范圍。

以下是對我決定解決該算法的方式的粗略解釋:

OP提出的問題與在k唯一的盒子上分布n唯一的元素的經典示例有關。 在這種情況下, arr有9個獨特的元素,需要分布在三個不同的位置上,並由容器arr2 因此,解決此問題的第一步是弄清楚如何實現給定nk的函數,該函數能夠計算適用的所有可能分布。

我能想到的最接近的是第二類斯特林數,其定義為:

將一組n個元素划分為m個非空集(即m個集塊)的方式的數量,也稱為斯特林集數。 例如,集合{1,2,3}可以通過一種方式分為三個子集:{{1},{2},{3}}; 通過三種方式分為兩個子集:{{1,2},{3}},{{1,3},{2}}和{{1},{2,3}}; 並以一種方式分為一個子集:{{1,2,3}}。

如果您密切注意所提供的示例,您將認識到它與在INDISTINGUISHABLE分區上可能的所有分布組合的枚舉有關,因為順序無關緊要。 由於在我們的情況下,容器arr2中的每個斑點都代表一個唯一的斑點,因此順序確實很重要,因此我們將需要枚舉arr2每個可能組合上的所有斯特林組合。 實際上,這意味着對於我們的示例arr2.length === 3 ,我們將需要將所有斯特林組合應用於[100,120,140][120,140,100][140,100,120]等(總共6個排列)

這里的主要挑戰部分是實現斯特林功能,但幸運的是已經有人這樣做了: http : //blogs.msdn.com/b/oldnewthing/archive/2014/03/24/10510315.aspx

復制並粘貼斯特靈函數並使用它在3個唯一的點上分配arr之后,現在您需要過濾掉未總計到arr2包含的指定點的分布。

這將為您提供所有可能的解決方案。 在您的情況下,對於var arr = [10,20,30,40,50,60,70,80,90]; var arr2 = [100,120,140]; 根本沒有解決方案。

一個快速的解決方法是將分配目標arr2[100,120,140]擴展到[100,120,140,90] 更好的解決方法是在找到零個解決方案的情況下,然后從列表arr一個元素,直到獲得解決方案。 然后,您可以稍后通過包含此元素來擴展您的解決方案集,該元素表示該元素與其自身的映射。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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