关于List链表的想法(跳表实现,现在还写不出(没时间),记录一下,用来以后完善)

想法:

 这是一条普通的链表

这是我的一个优化想法

分析:

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接口,类怎么排序由类的实现者规范

        每次先用跳表数据结构实现查找应该放到什么位置,然后插入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值