一亿个8位数字,用什么排序方法 中国之最大数( 二 )


2、将位图中所有比特位的默认值设置为 0。
3、遍历集合中的每一个元素,根据元素的数值,将此元素所在索引位的值设置为1 。
这样一来呢,只要从头开始遍历这个位图,依次找出值为1的比特位,这个比特位的索引就是实际的值,顺序一下就出来了 。
接近一亿个8位以内的排序回到最开始说的那个问题,将近一亿个8位以内的数排序,差不多就是一亿个数的全排列了,那最大的数就按照一亿算,差不多是12.5M,比快速排序算法全放到内存中的400M要小的多了 。
public static void main(String[] args) {String inputFile = "random_numbers.txt";int maxRandomNumber = 999999999;// 从文本文件中读取随机数Set<Integer> randomNumbers = new HashSet<>();try (BufferedReader reader = new BufferedReader(new FileReader(inputFile))) {String line;while ((line = reader.readLine()) != null) {int randomNumber = Integer.parseInt(line);randomNumbers.add(randomNumber);}} catch (IOException e) {return;}// 将随机数转换为位图BitSet bitmap = new BitSet(maxRandomNumber1);for (int num : randomNumbers) {bitmap.set(num);}//输出到一个文件String outputFile = "sorted_random_numbers.txt";try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {for (int i = 0; i <= maxRandomNumber; i) {if (bitmap.get(i)) {writer.write(String.format("d", i));writer.newLine();}}System.out.println("随机数已成功从文件中位图排序并写入文件:"outputFile);} catch (IOException e) {System.err.println("写入文件时出现错误:"e.getMessage());}}另外说一点,这接近一亿个数应该是没有重复数据的情况,如果重复数据过多,用位图排序就要用很多额外的手段来标记重复,到最后可能得不偿失 。
位图的使用场景排序小范围整数:
位图排序对于排序小范围的非负整数非常高效 。当待排序的整数范围相对较小,并且整数数量较大时,传统的比较排序算法如快速排序、归并排序等可能会有较大的开销,而位图排序则能够在较短的时间内完成排序 。
刚才这个接近一亿个数是个比较极端的例子,很多时候其实位图占用的空间还是比较大的,只要有一个特别大的数,就会把整个空间放大 。
去重操作:
位图排序可以用于去除重复的元素 。通过位图排序,可以快速识别是否有重复元素,并对重复元素进行去重操作 。
查找元素:
位图排序可以用于快速查找元素是否存在 。在位图中,每个整数对应一个位,如果位为1表示该整数存在,如果位为0表示该整数不存在 。通过查找对应的位,可以快速判断一个整数是否存在 。
统计频率:
位图排序可以用于统计整数出现的频率 。通过在位图中记录整数的出现次数,可以快速计算每个整数的频率 。
集合操作:
位图排序可以用于进行集合操作,如并集、交集、差集等 。通过对两个位图进行位运算,可以快速得到集合操作的结果 。
来源:https://mp.weixin.qq.com/s?__biz=MzAxMjA0MDk2OA==&mid=