我正在寻找一个不寻常的c#容器库供用于 调度搜索算法。搜索算法评估解决方案 通过不同的排列识别并寻找最佳解决方案 找。作为算法的一部分,它需要先记住 '访问'解决方案,以便它可以避免在循环循环中结束。因此,我 需要一个由排列索引的容器。排列是 一个大小为N的数组,在'随机'中保存值0到N-1 顺序。
容器只需要存储一个指示位置的布尔值 被访问过。它需要快速查找,它需要做 有效利用记忆。
我怀疑一棵树可能是最佳的...但只有在存在的情况下 库,因为这个问题也受到我实施它的可用时间的限制。
祝你好运
答案 0 :(得分:1)
您可以使用哈希集快速查找permations。
创建一个类作为哈希集中的键,以及类的相等比较器,如:
publc class Permutation {
private int[] _values;
public Permutation(int[] values) {
_values = values;
}
public class Comparer : IEqualityComparer<Permuation> {
public int GetHashCode(Permuation x) {
int code = 0;
foreach (int value in x._values) {
code = code * 251 + value;
}
return code;
}
public bool Equals(Permuation x, Permuation y) {
if (x._values.Length != y._values.Length) return false;
for (int i=0; i<x._values.Length; i++) {
if (x._values[i] != y._values[i]) return false;
}
return true;
}
}
}
然后你可以创建一个使用类作为键的哈希集,并且它是评估相等性的比较器:
var permutations = new HashSet<Permutation>(new Permutation.Comparer());
现在,您可以创建排列对象并放入集合中,并对其进行测试:
permuations.Add(new Permuation(new int[]{1,2,3}));
Permutation lookingFor = new Permutation(new int[]{1,2,3});
bool exists = permutations.Contains(lookgFor); // returns true
Permutation lookingFor = new Permutation(new int[]{1,3,2});
bool exists = permutations.Contains(lookgFor); // returns false
答案 1 :(得分:1)
总是需要权衡利弊。这是速度还是记忆。排列可以按here所述转换为索引,但成本很高。另一方面,您不需要转换它们。根据你所写的内容,我知道你的算法可以处理排列,因此它“知道”它们。在这种情况下,它可以按原样存储它们(访问)(例如,在列表或散列集中)。在这种情况下,您不会花费额外的时间将排列“压缩”到索引中,但是您需要确保有足够的内存。
另一项值得做的心理练习是调整你的算法需要存储“访问”状态的多少种不同的排列。这样您就可以更真实地决定是否需要节省内存,或者可以选择性能更快的选项。
还有一段时间以前,我搜索了“c#permutations”,并且能够找到一些组合库,无论它们是否提供你想要的或者我不知道的,我建议你看看它们,看看它们是否可以适合你。
答案 2 :(得分:0)
我认为hash table可能就是你要找的东西。查找时间是不变的,向容器添加新元素的时间也是不变的(只要你没有“溢出”它,那么增加容器容量需要线性时间。) / p>
答案 3 :(得分:0)
只需我的两分钱:have a look at this code
给定的链接包含用树实现的置换容器,这意味着快速查找和公平的内存使用。
使用GetPermutations()
可能会改进Stack<T>
方法,但这只是给读者留下的练习:D