提交 8acda275 编写于 作者: 梦境迷离's avatar 梦境迷离

fix

上级 8cdb8d3f
...@@ -755,7 +755,7 @@ public class BucketSort extends Constant { ...@@ -755,7 +755,7 @@ public class BucketSort extends Constant {
4. 当临时数组存满时,将数组写至磁盘,并清空数组内容。 4. 当临时数组存满时,将数组写至磁盘,并清空数组内容。
5. 重复过程(3)、(4),直至所有文件块读取完毕。 5. 重复过程(3)、(4),直至所有文件块读取完毕。
### Collections.sort使用哪种排序算法?Arrays.sort() ? ### Collections.sort使用哪种排序算法 ?Arrays.sort() ?
1、Arrays.sort() 1、Arrays.sort()
...@@ -768,17 +768,16 @@ public class BucketSort extends Constant { ...@@ -768,17 +768,16 @@ public class BucketSort extends Constant {
总结一下Arrays.sort()方法,如果数组长度大于等于286且连续性好的话,就用归并排序,如果大于等于286且连续性不好的话就用双轴快速排序。 总结一下Arrays.sort()方法,如果数组长度大于等于286且连续性好的话,就用归并排序,如果大于等于286且连续性不好的话就用双轴快速排序。
如果长度小于286且大于等于47的话就用双轴快速排序,如果长度小于47的话就用插入排序。 如果长度小于286且大于等于47的话就用双轴快速排序,如果长度小于47的话就用插入排序。
但是,当数组的元素是对象时,则与Collections.sort()相同。 但是,当数组的元素是对象时,则与Collections.sort()相同,内部使用legacyMergeSort()和TimSort.sort()
2、Collections.sort() 2、Collections.sort()
底层调用归并排序legacyMergeSort()和TimSort.sort(),实际就是用了Arrays.sort(元素是对象的实现) 底层调用归并排序legacyMergeSort()和TimSort.sort(),实际就是用了Arrays.sort。
Timsort是结合了归并排序(merge sort)和插入排序(insertion sort)而得出的排序算法,它在现实中有很好的效率。 Timsort是结合了归并排序(merge sort)和插入排序(insertion sort)而得出的排序算法,它在现实中有很好的效率。
大体是说,Timsort是稳定的算法,当待排序的数组中已经有排序好的数,它的时间复杂度会小于 nlogn。与其他合并排序一样,TimSort是稳定的排序算法,最坏时间复杂度是 O(nlogn)。 大体是说,Timsort是稳定的算法,当待排序的数组中已经有排序好的数,它的时间复杂度会小于 nlogn。与其他合并排序一样,TimSort是稳定的排序算法,最坏时间复杂度是 O(nlogn)。
在最坏情况下,和TimSort算法需要的临时空间是 n/2,在最好情况下,它只需要一个很小的临时存储空间 在最坏情况下,和TimSort算法需要的临时空间是 n/2,在最好情况下,它只需要一个很小的临时存储空间
### 256M的内存如何对16g的数组进行排序 ? ### 256M的内存如何对16g的数组进行排序 ?
多路归并,因为没要求存储,只要求了内存,可以多路归并。 多路归并,因为没要求存储,只要求了内存,可以多路归并。
...@@ -802,24 +801,23 @@ Timsort是结合了归并排序(merge sort)和插入排序(insertion sort ...@@ -802,24 +801,23 @@ Timsort是结合了归并排序(merge sort)和插入排序(insertion sort
1. 如果重复率很高,可以采用前缀树,因为trie树适用于数据量大,重复多,但是数据种类小必须得可以放入内存; 1. 如果重复率很高,可以采用前缀树,因为trie树适用于数据量大,重复多,但是数据种类小必须得可以放入内存;
2. 按照hash进行分组,这样就能避免相同的数分到不同区域去了,导致不好统计。hash分组完毕后,然后用前缀树或者hashmap来计算每个组的前k个频率最高的数,最后对各个组的前k个数进行统计即可。 2. 按照hash进行分组,这样就能避免相同的数分到不同区域去了,导致不好统计。hash分组完毕后,然后用前缀树或者hashmap来计算每个组的前k个频率最高的数,最后对各个组的前k个数进行统计即可。
### 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中 ### 在40亿个乱序且不重复的unsigned int的整数中判断数x是否存在
这里我们把40亿个数中的每一个用32位的二进制来表示 这里我们把40亿个数中的每一个用32位的二进制来表示,假设这40亿个数开始放在一个文件中。
假设这40亿个数开始放在一个文件中。
然后将这40亿个数分成两类: 然后将这40亿个数分成两类:
1.最高位为0 1. 最高位为0
2.最高位为1 2. 最高位为1
并将这两类分别写入到两个文件中,其中一个文件中数的个数<=20亿而另一个>=20亿(这相当于折半了);与要查找的数的最高位比较并接着进入相应的文件再查找 并将这两类分别写入到两个文件中,其中一个文件中数的个数<=20亿而另一个>=20亿(这相当于折半了);与要查找的数的最高位比较并接着进入相应的文件再查找
再然后把这个文件为又分成两类: 再然后把这个文件为又分成两类:
1.次最高位为0 1. 次最高位为0
2.次最高位为1 2. 次最高位为1
并将这两类分别写入到两个文件中,其中一个文件中数的个数<=10亿而另一个>=10亿(这相当于折半了);与要查找的数的次最高位比较并接着进入相应的文件再查找。 并将这两类分别写入到两个文件中,其中一个文件中数的个数 <=10 亿而另一个 >= 10亿(这相当于折半了);与要查找的数的次最高位比较并接着进入相应的文件再查找。
以此类推,就可以找到了,而且时间复杂度为 O(logn)。 以此类推,就可以找到了,而且时间复杂度为 O(logn)。
### 海量数据求TopK的普遍方法 ### 海量数据求TopK的普遍方法
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册