我正在寻找一种算法来生成集合的排列,这样我就可以在Clojure中创建它们的惰性列表.即我想迭代一个排列列表,其中每个排列都不计算,直到我请求它,并且所有排列不必一次存储在内存中.
或者我正在寻找一种给定某个集合的算法,它将返回该集合的"下一个"排列,以这种方式在自己的输出上重复调用该函数将循环遍历原始集合的所有排列,一些订单(订单无关紧要).
有这样的算法吗?我见过的大多数排列生成算法都倾向于一次性生成它们(通常是递归的),这些算法不能扩展到非常大的集合.Clojure(或其他函数式语言)中的实现会有所帮助,但我可以从伪代码中找出它.
给定一个较大的正整数“权重”数组(例如[ 2145, 8371, 125, 10565, ... ])和一个正整数“权重限制”例如15000,我要使用以下条件将权重划分为一个或多个较小的数组:
我怀疑这个问题的复杂程度很高。作为答案,我感兴趣:
当前的非最佳方法:(基本贪婪算法; JavaScript)
function minimizePartitions(weights, weightLimit) {
let currentPartition = [];
let currentSum = 0;
let partitions = [ currentPartition ];
for (let weight of weights) {
if (currentSum + weight > weightLimit) {
currentPartition = [];
currentSum = 0;
partitions.push(currentPartition);
}
currentPartition.push(weight);
currentSum += weight;
}
return partitions;
}
let weights = [3242, 987, 1222, 7299, 400, 10542, 10678, 513, 3977];
console.log(minimizePartitions(weights, 15000));Run Code Online (Sandbox Code Playgroud)
所以我收到了一个挑战,声明如下:"设计一个程序,将一个9位数字作为输入,其中没有数字出现两次,并产生与下一个最高数字对应的相同9位数的排列.如果不存在这样的数字,算法应该指出这一点.例如,如果输入是781623954,则输出将是781624359."
所以我提出了这个想法来翻转索引,所以检查最后一个索引,看看哪个更大,比较然后翻转,如果有必要但由于某种原因我的代码不工作.我只做了检查最后两位数而不是所有数字的工作,所以如果你可以帮我解决并为我检查,如果你对如何解决这个问题有任何更好的想法,请分享.
input = raw_input("Enter 9 Digits: ")
x = 9
while x>0:
x-=1
if input[8] > input[7]:
temp = input[8]
input[8] == input[7]
input[7] == temp
print input
break
Run Code Online (Sandbox Code Playgroud)