想法:
这是一条普通的链表
这是我的一个优化想法
分析:
1. 链表的优势和劣势:插入和删除非常方便,查找起来可能需要全部遍历一遍,最差的查找时间为O(n)
1.关于劣势——查询:和集合比较有时候并不一定是劣势,如果你集合不知道下标,而是说想找出某个对象,比如我知道某个人的姓名(这里假设姓名是唯一的),但是我并不知道他的下标是什么。我还不是要一个个去遍历?那可能唯一差一点就是差在数组是有序的,直接在磁盘一顺溜找下去就行了,链表需要一个个跳。数据量大的话差距就出来了。
2. 怎么去解决这个查询的劣势?—— 使用多条链表辅助跳跃查找
3.应该设置多少条辅助链表?—— 设置一个阙值x,比如我上面的图片,两个节点之间间隔的节点就是1那么阙值x就是1
关于辅助链表
1.我认为应该提供一个方法,方法的参数就是x,如果调用这个方法的话,该对象就会根据x生成所有辅助链表,然后就开始跳跃式查找。
2.x的默认值,通过数学计算,计算出空间和时间最优的方法(比x大就是时间换空间,比x小那就是空间换时间了)
3.关于x的大小,每一条辅助链表都是一条物理链表,x肯定是越小越快的,但是想对应的,查询速度就更快,比如40亿条数据,如果x为1的话就需要设置大概32条数据。比起普通的查询,速度将会快上很多,但是相对应的就会浪费很多的空间。空间和时间就取决于用户的取舍。
4. 那么用什么去作为表示比较呢?比如数据库B+tree用的主键,那我应该用什么?用Hash值吗?Hash值是随机无序的感觉并不适合比较,那我给对象加一个标识符(比如说第三个插入的那么就是3*1.3),然后通过这个的对象的标识符和他的hash值计算?(有点懵,一下子不知道该用什么,先记录一下想法,而且感觉和HashMap越来越像了,到时候去重新深入一下hashMap)。
1.这里我想明白了,可以使用Hash计算,学习HashMap的Hash值计算方法,然后通过计算完的Hash值来当作链表的索引,当时缺点就来了,
1.插入没办法使用尾插法,因为每次插入都要给他计算位置,然后遍历到这个位置插入(),比较浪费时间。
2.链表变得无序,比如你第二个插入的数据,结果去跑到第九个位置去了。
5. 适合什么场景?——大数据量插入后的频繁查询
反思:
1. 突然感觉没啥用,如果大数据持久化为什么不存到数据库里面去呢?比如mysql的B+tree也挺快的,而且在程序里面持久化,还容易导致数据丢失(程序挂掉)。
2.就普通的使用的话,根本不会放这么大数据量,如果小的数据量,用数组不也不错?
3.这只是个想法,写在博客上之后开始怀疑觉得不太行,但是我之后有时间,还是会去想办法用Java实现这个数据结构,也是对自己思维逻辑的一个锻炼
4.如果大家有什么建议,希望能够在评论里面提出来,也算指点迷津了,感激不尽!!!
小目标:实现一个使用链表的自动排序集合,
该集合需要实现Comparable接口,类怎么排序由类的实现者规范
每次先用跳表数据结构实现查找应该放到什么位置,然后插入。