作业帮 > 数学 > 作业

求一个高效算法:已知n个数,取其中的m个数(m100,m=10,如果穷举,那计算机要算爆了),

来源:学生作业帮 编辑:百度作业网作业帮 分类:数学作业 时间:2024/07/13 17:43:13
求一个高效算法:已知n个数,取其中的m个数(m100,m=10,如果穷举,那计算机要算爆了),
求一个高效算法:已知n个数,取其中的m个数(m100,m=10,如果穷举,那计算机要算爆了),
你是要找出所有的符合要求的组合,还是只需要一个就可以?
再问: 需要找出所有符合要求的组合。
再答: 楼主熟悉普通的从N个数中找出所有M个数的算法吗?你这个情况仅仅需要在其之上加一个条件判断即可,每次不是单纯线形的寻找下一个数,而是判断如果下一个数与当前选出的离它最近的数之差是否大于t。 随手写了个测试了一下,核心方法如下,仅供参考: a是总数集合,你需要事先排序,这是一个可以有效减少比较次数的办法 n是a的数量 m是组合数量 b是输出结果 M是m的一个copy 这是c#写的,把输出函数换掉后,应该是几种常用语言通用的了 public void combine(int[] a, int n, int m, int[] b, int M) { int i, j; for (i = n; i >= m; i--) { b[m - 1] = i - 1; if (m > 1) combine(a, i - 1, m - 1, b, M); else { int c = M - 1; for (j = M - 1; j >= 0; j--) if (j == M - 1) Console.Write(a[b[j]]); else if (a[b[j+1]] - a[b[j]] >= t) // 这里就是添加的判断 Console.Write(a[b[j]]); Console.Write("\n"); } } } 而既然你要找出所有符合的组合,计算量基本就确定了,因为C(n,m)这个算法已经有很多人论证过了,楼上所说的那种情况的确会发生,我建议你结合一些算法之外的策略来避免,比如从控制输入上面来辅助,这段代码我没整理的太仔细,输出了一些空组合,但其中所有m个数的组合应该就是你想要的,你可以自己过滤一下