[英]Is there an efficient way to find all ordered arrangements of elements in the set S that add up to N?
這就是我的意思。 假設S = {1, 4}
和N = 5
。 集合S
中元素的有序排列如下
{1}, {4}, {1,1}, {1,4}, {4,1}, {4,4}, {1,1,1}, ....
和那些總和為N
是
{1,4}, {4, 1}, {1,1,1,1,1}
我想要一個算法來有效地找到那些。
我的“蠻力”方式就像
static IEnumerable<IEnumerable<int>> OrderedArrangements(IEnumerable<int> nums, int k)
{
var singles = nums.Select(i => new int[] {i} );
var cumulative = singles;
for(int j = 2; j <= k; ++j)
{
var last = cumulative.Where(list => list.Count() == (j - 1));
var next = from x in singles
from y in last
select x.Concat(y);
cumulative = cumulative.Concat(next);
}
return cumulative;
}
進而
int sumToN = OrderedArrangements(new int[] {1, 4}, N)
.Where(x => x.Sum() == N);
但我想知道是否有一種明顯且更有效的方法來做到這一點。
以防萬一上面的答案不夠清楚,您可以嘗試直接遞歸,例如
...
/ \
(1) (4)
/ \ / \
(1)(4) (1)(4)
static void f(int sum, int n, String str, int[] arr){
if (n == sum){
Console.WriteLine(str);
return;
}
if (n > sum) return;
for (int i = 0; i < arr.Length; i++){
f(sum, n + arr[i], str + arr[i].ToString(), arr);
}
}
static void Main(string[] args){
int[] arr = { 1, 4 };
f(5, 0, "", arr);
}
在您的問題中sum
是N
時, n
被初始化為0
, str
被初始化為""
並且arr
在您的問題中是S
。
輸出:
11111
14
41
這對我有用:
static IEnumerable<IEnumerable<int>> OrderedArrangements(IEnumerable<int> nums, int k)
{
return
k <= 0
? new [] { Enumerable.Empty<int>() }
: nums
.SelectMany(
n => OrderedArrangements(nums, k - n),
(n, ns) => new [] { n }.Concat(ns))
.Where(ns => ns.Sum() == k);
}
OrderedArrangements(new [] { 1, 4 }, 5)
是:
我運行了這個性能測試代碼:
Func<Func<IEnumerable<IEnumerable<int>>>, double> measure = f =>
{
var sw = Stopwatch.StartNew();
var result = f();
sw.Stop();
return sw.Elapsed.TotalMilliseconds;
};
var n = 200;
var a = 0.0;
var b = 0.0;
for (var i = 0; i < n; i++)
{
a += measure(() => OrderedArrangements_A(new [] { 1, 4, 9, 13 }, 50000));
b += measure(() => OrderedArrangements_B(new [] { 1, 4, 9, 13 }, 50000));
}
OrderedArrangements_A
是 OP 的代碼,而OrderedArrangements_B
是我的。
“A”的平均時間為 15.6 毫秒,“B”的平均時間為 0.004 毫秒。 對於這個測試,我的代碼運行速度快了大約 3,895 倍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.