双向链表java实现 一道java面试题,20亿数字的文本排序,如何取前100?
一道java面试题,20亿数字的文本排序,如何取前100?因为这是一个Java问题,所以这是典型的TOPK问题。首先取前100个数字构建一个最小堆,然后依次从堆的顶部插入剩余的数字,同时调整堆。堆中最
一道java面试题,20亿数字的文本排序,如何取前100?
因为这是一个Java问题,所以这是典型的TOPK问题。首先取前100个数字构建一个最小堆,然后依次从堆的顶部插入剩余的数字,同时调整堆。堆中最后100个元素就是结果。链表是物理存储单元上的一种非连续、非顺序的存储结构。数据元素的逻辑顺序是通过链表中的指针链接顺序来实现的。链表由一系列节点组成(链表中的每个元素称为节点),这些节点可以在运行时动态生成。每个节点包括两部分:一部分是存储数据元素的数据字段,另一部分是存储下一个节点地址的指针字段。与线性表序结构相比,操作更为复杂。由于链表不需要按顺序存储,因此链表插入时的复杂度可以达到o(1),比其他线性序列表快得多。但是,查找节点或访问具有特定编号的节点需要O(n)个时间。线性表和序列表的时间复杂度分别为o(logn)和o(1)。
使用链表结构可以克服数组链表需要提前知道数据大小的缺点。链表结构可以充分利用计算机内存空间,实现灵活的动态内存管理。然而,链表失去了随机数组读取的优势,由于增加了节点的指针字段,链表的空间开销相对较大。链表最明显的优点是关联项的常规数组排列可能与这些数据项在内存或磁盘中的排列顺序不同,数据的存取往往需要按不同的排列顺序进行转换。链表允许在列表的任何位置插入和删除节点,但不允许随机访问。链表有许多不同的类型:单向链表、双向链表和循环链表。链表可以用许多编程语言实现。链表的访问和操作包含在LISP和scheme等语言的内置数据类型中。编程语言或面向对象语言(如C、C和Java)依赖于变量工具来生成链表。
链表是谁发明的?
我猜您向人们询问了各种JDK数据结构的基本实现原则。事实上,我一直在想。知道基本的实现原则是可以的,也是值得的,但是如果你不知道呢?人们知道哪些数据结构适用于哪些场景,并且能够熟练地使用它们。那不是。。。够了吗?对贵公司的需求不足吗?你希望他为你的公司创建一个新的数据结构吗?就像two peas或JDK一样,JDK的数据结构性能遇到了瓶颈,求职者会给你提供比工作提供的数据结构更好的数据结构。