我有一个任意哈希数组,哈希的元素是一个整数(称之为'id')。我想将这些哈希值分类为多个桶(在数组上保持不变),其中每个桶都是'ids'的任意范围(例如1-10,15-20,20-30)。这样做的最佳排序策略是什么?没有嵌套循环可以吗?
答案 0 :(得分:1)
如果桶的数量很少,那么嵌套循环可能会更好。在哈希上方的外环和在水桶上方的内部。 O(n*m)
。
如果哈希的数量和存储桶的数量很大,您可以:
hashes = sort(hashes)
buckets = sort(buckets) # sort by lower-bound of bucket
i = 0
foreach (hash in hashes) {
while (buckets[i].lower_bound > hash) {
i = i + 1
}
bucket[i].add(hash)
}
基本上循环通过哈希将它们添加到当前存储桶并在需要时前进到下一个存储桶。 O(n * log(n)+ m * log(m))
答案 1 :(得分:1)
如果散列质量很好,它们会呈现均匀分布,因此您可以使用均匀分布的桶来一次性分割集合。
如果您还希望在存储桶中对哈希进行排序,请在所有内容都在存储桶中后使用常规排序算法。然而,这将是哈希的一种不寻常的用法。 (如果你不想在桶中进行排序,那么“sort”这个词就是用词不当。你真正想要的是分区。)
答案 2 :(得分:0)
您没有提及语言/平台,但在击键方面效率很高(C#):
var histogram = new[] { 0, 10, 15, 20, 30, 40 };
var values = new[] { 12, 14, 5, 6, 7, 1, 34, 26, 17 };
var bars = values.GroupBy(v => histogram.First(b => v < b));