|NO.Z.00043|——————————|BigDataEnd|——|Hadoop&ElasticSearch.V43|——|ELK.v43|原理剖析|数据结构.V1|
一、SkipList应用
### --- 概述
~~~ 假设某个索引字段中有sex,address字段,检索条件为:sex='female' and address='北京',
~~~ 给定查询过滤条件 sex='female'的过程就是先从 term index
~~~ 找到 femal 在 term dictionary 的大概位置,
~~~ 再从 term dictionary 里精确地找到 female 这个 term,
~~~ 然后得到一个 posting list 或者一个指向 posting list位置的指针。
~~~ 查询 address='北京' 的过程类似的。
~~~ 得到一个 posting list 或者一个指向 posting list 位置的指针
~~~ 需要计算出 sex='female' and address='北京' 就是把两个 posting list 做一个“与”的合并。
~~~ ES中使用 skip list 数据结构。同时遍历 sex和 address 的 posting list,互相 skip!!
二、有序集合计算交集
### --- 有序集合计算交集
~~~ # 有序集合
list1:{1,2,3,4,20,21,22,23,50,60,70}
list2:{50,70}
### --- 拉链法
~~~ 两个指针指向首元素,比较元素的大小:
~~~ 如果相同,放入结果集,随意移动一个指针
~~~ 否则,移动值较小的一个指针,直到队尾
~~~ # 这种方法的优势是:
~~~ 集合中的元素最多被比较一次,时间复杂度为O(n)
~~~ 多个有序集合可以同时进行,
~~~ # 跳表SkipList
~~~ 有序链表集合求交集,跳表是最常用的数据结构,
~~~ 它可以将有序集合求交集的复杂度由O(n)降至O(log(n))如果使用拉链法,
~~~ 会发现每个元素都要被比对但是其中有很多其实是无效比对,时间复杂度为O(n),
~~~ 所谓跳表可以把时间复杂度优化至O(logn),就是因为使用跳表可以跳过很多无效比对!!

三、跳表实现(扩展)

### --- 搜索过程
~~~ 从顶层链表的首元素开始,
~~~ 从左往右搜索,直至找到一个大于或等于目标的元素,或者到达当前层链表的尾部
~~~ 如果该元素等于目标元素,则表明该元素已被找到
~~~ 如果该元素大于目标元素或已到达链表的尾部,
~~~ 则退回到当前层的前一个元素,然后转入下一层进行搜索
四、添加元素:随机决定新添加元素的层数(抛硬币)

五、删除元素:注意修改跳表的有效层数

Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv025-elk
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通