Arrays 缓存优化-Hashmap vs QuickSort?

Arrays 缓存优化-Hashmap vs QuickSort?,arrays,caching,hashmap,big-o,Arrays,Caching,Hashmap,Big O,假设我有N个未排序的整数数组。我想找出这些数组的交集 解决这个问题有两种好方法 首先,我可以使用nlogn排序对数组进行就地排序,如快速排序或合并排序。然后我可以在每个数组的开头放一个指针。将每个数组与它下面的数组进行比较,迭代较小数组的指针,或者如果它们都相等,则找到一个交集 这是一个O(nlogn)解决方案,具有恒定的内存(因为所有操作都在适当的位置完成) 第二种解决方案是使用散列映射,将第一个数组中显示的值作为键输入,然后在遍历其余数组时增加这些值(然后获取所有值为N的值)。这是一个O(n

假设我有N个未排序的整数数组。我想找出这些数组的交集

解决这个问题有两种好方法

首先,我可以使用nlogn排序对数组进行就地排序,如快速排序或合并排序。然后我可以在每个数组的开头放一个指针。将每个数组与它下面的数组进行比较,迭代较小数组的指针,或者如果它们都相等,则找到一个交集

这是一个O(nlogn)解决方案,具有恒定的内存(因为所有操作都在适当的位置完成)

第二种解决方案是使用散列映射,将第一个数组中显示的值作为键输入,然后在遍历其余数组时增加这些值(然后获取所有值为N的值)。这是一个O(n)解决方案,具有O(n)内存,其中n是所有阵列的总大小

理论上,前者的解是o(nlogn),后者是o(n)。然而,散列映射没有很好的局部性,这是因为由于冲突,项目可以在映射中随机分散。另一种解决方案虽然是o(nlogn),但一次只遍历一个数组,显示出良好的局部性。由于CPU倾向于将当前索引旁边的内存中的数组值拉入缓存,因此O(nlogn)解决方案比哈希映射解决方案更频繁地命中缓存


因此,给定一个非常大的数组大小(当元素数量趋于无穷大时),o(nlogn)解实际上比o(n)解快是可行的吗

对于整数,可以使用非比较排序(请参阅)。可能会对大型集合进行编码,例如,按范围顺序运行。这将压缩数据集并允许跳过较大的块(请参阅)。具有硬件友好性和O(n)复杂性的潜力

复杂性理论不考虑常数。正如您所怀疑的,由于隐藏常数,具有更高复杂性的算法总是有可能比备选算法更快。通过利用问题的性质,例如将解决方案限制为整数,存在通用方法无法实现的潜在优化。好的算法设计通常需要理解和利用这些约束