双链表创建全过程java 一道java面试题,20亿数字的文本排序,如何取前100?

[更新]
·
·
分类:互联网
4209 阅读

双链表创建全过程java

一道java面试题,20亿数字的文本排序,如何取前100?

一道java面试题,20亿数字的文本排序,如何取前100?

每行一个数字

自己写个最小(大)堆不就完了,c 也可以用标准库里的优先队列。先找出前100大,然后再对前100大进行排序就是结果。。。。这题目简直不要太简单。。。。常见扩展就是1亿个url,如何找出出现最次数前100多的url。

有点笨的方法.:将20亿的数字分成2000(2万)个数据一段(或文件),对每组数组取1个(也可10个),直接汇总既可。也可多取再二次分组或三次分组。更多次就约准确。

我作为一个外行看来,这样的方案应该可以吧:假如要找出的是排大到小的前100.那么随机抓取20亿个中的100个,然后将这100个数排序,然后将剩下的数字中逐个跟100个中的最小的比较,如果比100个中最小的小,就淘汰这个,换下一个,如果那个数比100个中的最小的大,则将这个数置换掉那个最小的,100个再排序,(这次排序就很快了),接着再从剩余的数字中抓一个来比较,直至20亿个全部比较完,剩下的100个就是最大的前100

我赞成两个靠谱的回答
1
取100个数字排序,后面的数字依次和100个数字最小的比,最后留下100个最大的
2
根据字符串长度、小数、负数几个属性分类,可以直接排除部分较短的数字不转化为数字,然后做排序。这应该能省一些转换数字的时间吧?

好奇JAVA开发LinkedList插入数据真的比ArrayList快吗?

这个没啥好不好奇的。数据结构决定了的。
链表插入数据就是将节点加入到尾部,算法时间复杂度是O(1),相当于插入数据的时间开销是一个常量。
ArrayList是基于数组的实现,插入数据时要看数组的容量够不够,容量足够的话和链表插入性能差不多,但如果不够就需要扩容,扩容就相当于建立一个新数组,把原来的数据复制过去,这个开销就比较大了,
所以在使用ArrayList时,如果指定了一个合适的Capacity,在使用时可以不扩容或者减少扩容次数,就可以提高程序的性能。

首先你得知道arraylist底层是依赖与数组,linklist底层依赖与链表。
然后你去翻翻数据结构这边书,你就知道了!

必须的,一个是直接修改链表,一个需要挪动数组。

Arraylist是数组实现的
1 除了插入尾部,都要把后边的数据往后边挪动。
2 扩容的时候还要全部拷贝到新数组中
Linkedlist是链表,无上边两个缺点,
不过查找的时候要从头next到去找,也可以从尾部向前找,总之查询没这么快。