From 8acda2754014a750edb4fae6b5e150cc506a16f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=A6=E5=A2=83=E8=BF=B7=E7=A6=BB?= Date: Sat, 2 May 2020 14:06:56 +0800 Subject: [PATCH] fix --- ...22\345\272\217\347\256\227\346\263\225.md" | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git "a/docs/_posts/\347\256\227\346\263\225/2018-08-11-\347\256\227\346\263\225-\346\216\222\345\272\217\347\256\227\346\263\225.md" "b/docs/_posts/\347\256\227\346\263\225/2018-08-11-\347\256\227\346\263\225-\346\216\222\345\272\217\347\256\227\346\263\225.md" index b45800f8..aa45ed4c 100644 --- "a/docs/_posts/\347\256\227\346\263\225/2018-08-11-\347\256\227\346\263\225-\346\216\222\345\272\217\347\256\227\346\263\225.md" +++ "b/docs/_posts/\347\256\227\346\263\225/2018-08-11-\347\256\227\346\263\225-\346\216\222\345\272\217\347\256\227\346\263\225.md" @@ -755,7 +755,7 @@ public class BucketSort extends Constant { 4. 当临时数组存满时,将数组写至磁盘,并清空数组内容。 5. 重复过程(3)、(4),直至所有文件块读取完毕。 -### Collections.sort使用哪种排序算法?Arrays.sort() ? +### Collections.sort使用哪种排序算法 ?Arrays.sort() ? 1、Arrays.sort() @@ -768,17 +768,16 @@ public class BucketSort extends Constant { 总结一下Arrays.sort()方法,如果数组长度大于等于286且连续性好的话,就用归并排序,如果大于等于286且连续性不好的话就用双轴快速排序。 如果长度小于286且大于等于47的话就用双轴快速排序,如果长度小于47的话就用插入排序。 -但是,当数组的元素是对象时,则与Collections.sort()相同。 +但是,当数组的元素是对象时,则与Collections.sort()相同,内部使用legacyMergeSort()和TimSort.sort()。 2、Collections.sort() -底层调用归并排序legacyMergeSort()和TimSort.sort(),实际就是用了Arrays.sort(元素是对象的实现)。 +底层调用归并排序legacyMergeSort()和TimSort.sort(),实际就是用了Arrays.sort。 Timsort是结合了归并排序(merge sort)和插入排序(insertion sort)而得出的排序算法,它在现实中有很好的效率。 大体是说,Timsort是稳定的算法,当待排序的数组中已经有排序好的数,它的时间复杂度会小于 nlogn。与其他合并排序一样,TimSort是稳定的排序算法,最坏时间复杂度是 O(nlogn)。 在最坏情况下,和TimSort算法需要的临时空间是 n/2,在最好情况下,它只需要一个很小的临时存储空间 - ### 256M的内存如何对16g的数组进行排序 ? 多路归并,因为没要求存储,只要求了内存,可以多路归并。 @@ -802,24 +801,23 @@ Timsort是结合了归并排序(merge sort)和插入排序(insertion sort 1. 如果重复率很高,可以采用前缀树,因为trie树适用于数据量大,重复多,但是数据种类小必须得可以放入内存; 2. 按照hash进行分组,这样就能避免相同的数分到不同区域去了,导致不好统计。hash分组完毕后,然后用前缀树或者hashmap来计算每个组的前k个频率最高的数,最后对各个组的前k个数进行统计即可。 -### 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中 ? +### 在40亿个乱序且不重复的unsigned int的整数中判断数x是否存在 ? -这里我们把40亿个数中的每一个用32位的二进制来表示 -假设这40亿个数开始放在一个文件中。 +这里我们把40亿个数中的每一个用32位的二进制来表示,假设这40亿个数开始放在一个文件中。 然后将这40亿个数分成两类: -1.最高位为0 -2.最高位为1 +1. 最高位为0 +2. 最高位为1 并将这两类分别写入到两个文件中,其中一个文件中数的个数<=20亿,而另一个>=20亿(这相当于折半了);与要查找的数的最高位比较并接着进入相应的文件再查找 再然后把这个文件为又分成两类: -1.次最高位为0 -2.次最高位为1 +1. 次最高位为0 +2. 次最高位为1 -并将这两类分别写入到两个文件中,其中一个文件中数的个数<=10亿,而另一个>=10亿(这相当于折半了);与要查找的数的次最高位比较并接着进入相应的文件再查找。 +并将这两类分别写入到两个文件中,其中一个文件中数的个数 <=10 亿,而另一个 >= 10亿(这相当于折半了);与要查找的数的次最高位比较并接着进入相应的文件再查找。 以此类推,就可以找到了,而且时间复杂度为 O(logn)。 ### 海量数据求TopK的普遍方法 -- GitLab