多级索引算法只增删查改

问题描述

多级索引算法只增删查改

   多级索引算法
  在链表描述的具有length个元素的集合中进行搜索,至多需要length次访问节点。如果在链的中部节点加一个指针,并记录头部到中部的距离,则访问的节点数可以减少到n/2+1次。搜索时,首先将欲搜索的索引与头部到中部的距离进行比较,如果欲搜索的索引较小,则仅需搜索链表的左半部,否则,只要从中部开始搜索右半部。
  图3-1a的链表中有七个元素。该链表有一个头节点和一个尾节点。节点中的数表示该节点的索引值。如果要访问索引值为7的节点,对该链表的搜索要进行七次。在图3-1b中,增加了一个头部到中部的指针,指针上的数字表示头部到中部的距离。采用图3-1b中的办法,可以把最坏情况下的比较次数减为四次。搜索一个索引时,首先将它与头部到中间的距离进行比较,然后根据得到的结果,或者在链的左半部搜索或者在链的右半部搜索。
  如果在链表的左半部分和右半部分的中间节点再增加一个指针,可以进一步减少最坏情况下的搜索比较次数。如图3-1c,在该图中有三条链。0级链就是图3-1a中的初始链,包括了所有的七个元素。1级链包括了第2、4、6个元素,而2级链只包括了第4个元素。寻找某一个索引指定的元素时,只需要在2级链上比较一次,根据比较结果,在1级链上比较一次,最后在0级链上找出所需的元素。采用图3-1c中的3级链表结构,允许在链表中进行折半查找,对所有的索引至多需要3次比较。
  对一个有n个元素的多级链接结构来说,0级链包括全部的n个节点,1级链包括n/2个节点,2级链包括n/4个节点,而每2i个元素有一个i级链指针。当且仅当一个节点在0~i级链上,但不在i+1级链上时,我们就称该节点是i级链节点。在图3-1c中,索引为4的节点是2级链上的唯一节点,而索引为6的节点是1级链节点。
  图3-1c所示的结构称为多级链表结构。在该结构中,有一组有层次的链,通过这中有层次的链,实现折半查找。
  在进行插入和删除操作时,要完整保持图3-1c的结构,必须耗时O(n)。如果可以采取适当放宽结构,只要使得在删除和插入后尽量逼近图3-1c的结构就可以降低保持结构的开销。在这种结构只能管,有n/2i个节点为i级链节点,所以我们可以认为在进行插入时,新节点属于i级链的概率为1/2i。在确定新节点的级时,应考虑各种可能的情况。因此,把新节点作为i级链的可能性定为pi。图3-1c中,p=0.5。
  假设要在索引6的位置插入一个新的节点,首先要在链中找到索引为5和6的节点,然后在0级链上插入这个新的节点。接下来,要为新节点分配一个级,分配过程由随机数来确定。
  若新节点为i级链元素,那么,把这个节点分别插入到1~i级链中。最后,调整每一级链上新的节点左边节点到下一节点的距离。
  删除操作和插入操作类似,当删除一个节点时,必须要把这个节点从它的所有级别链上删除,同时调整该节点左边的节点到下一个节点的距离。
  关于级的分配,前面已经说到,新节点作为i级链的可能性为pi。换种思路,可以认为i-1级链中的节点属于i级链的概率为p。假设有一随机数产生器所产生的数在0到RAND_MAX之间。则下一次所产生的随机数小于等于CutOff=p*RAND_MAX的概率为p。因此,若下一随机术小于等于CutOff,则新节点应在1级链上。接下来确定新节点是否在2级链上。重复这个过程,直到一随机数大于CutOff为止。
  以下是确定节点的级的分配的代码
  int level=0;
  while (rand()<=CutOff) level++;
  这种方法潜在的缺点是可能为某些节点分配特别大的级。为避免这种情况,可以设定新节点的级不大于链上已有节点的最大级加1。

根据以上算法写出此算法的检索、插入和删除指定位置元素的操作的函数。(只写出一个思路也可以)

时间: 2024-09-27 23:27:18

多级索引算法只增删查改的相关文章

MySQL中对于索引的基本增删查改操作总结_Mysql

创建索引 MySQL创建索引的语法如下: CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON table_name (index_col_name,...) 其中对应的语法变量信息如下: [UNIQUE|FULLTEXT|SPATIAL] 中括号中的这三个关键字表示创建的索引类型,它们分别表示唯一索引.全文索引.空间索引三种不同的索引类型.如果我们不指定任何关键字,则默认为普通索引. index_name

数组 算法-基于数组的算法分析之增删查改

问题描述 基于数组的算法分析之增删查改 使用一个数组来描述集合,需要把集合中的每个元素映射到数组的具体位置上.下面我们用一个数学公式来确定每个元素的位置.一个简单的映射公式如下: location(i)=i-1 (2-1) 公式(2-1)指明集合中第i个元素(如果存在的话)位于数组中i-1位置处.为了完整的描述集合,使用变量length作为集合的长度. 在这种数据结构中,搜索一个元素只需根据公式(2-1)进行映射就能实现,其平均时间复杂度是O (1),性能非常理想. 为了在集合中删除第k个元素,

链表 算法-基于链表的算法分析之增删查改

问题描述 基于链表的算法分析之增删查改 在链表描述中,集合中的元素都放在链表的节点中进行描述.链表中的节点不是一个数组元素,因此不能通过公式来映射定位某个元素.取而代之的是,每个节点中都包含了下一个节点的位置信息,链表的表头包含了第一个节点的位置信息. 为了在集合中找到第k个元素,就必须从表头开始,遍历第1个到第k个节点.它的时间复杂度是O(k),平均时间复杂度为O(length). 为了在集合中删除第k个元素,就要先找到第k-1和第k个节点,使第k-1个节点的下一个节点位置信息指向第k+1个节

Java中单向链表的实现:增删查改功能

写一个大家都比较熟悉的数据结构:单向链表. 不过先告诉大家一个小秘密,java的API里面已经提供了单向链表的类,大家可以直接拿来用,不过学习数据结构课程的时候想必大家也已经知道,虽然系统会给我们提供一些常用的数据结构,但是自定义的总是能够带来不同的喜感的,而且通过自己的编写也更能够让我们了解其中实现的过程,而且我们还可以写一些比较个性化的方法作为属于自己的数据结构.这里主要是介绍一些常用结构里面都会用到的方法,以及链表具体是如何操作的. 首先,单链表相对于队列的优势在于存储地址不是连续的,这样

8天学通MongoDB——第二天 细说增删查改

      看过上一篇,相信大家都会知道如何开启mongodb了,这篇就细说下其中的增删查改,首先当我们用上一篇同样的方式打开mongodb,突然 傻眼了,擦,竟然开启不了,仔细观察"划线区域"的信息,发现db文件夹下有一个类似的"lock file"阻止了mongodb的开启,接下来我们要做的就 是干掉它,之后,开启成功,关于mongodb的管理方式将在后续文章分享.   一: Insert操作      上一篇也说过,文档是采用"K-V"格式

Yii2——使用数据库操作汇总(增删查改、事务)_php技巧

本文介绍了 Yii2--使用数据库操作汇总(增删查改.事务),具体如下: 对象操作 查询 //1.简单查询 $admin=Admin::model()->findAll($condition,$params); $admin=Admin::model()->findAll("username=:name",array(":name"=>$username)); $infoArr= NewsList::model()->findAll(&quo

SSH框架网上商城项目第2战之基本增删查改、Service和Action的抽取_java

上一节<SSH框架网上商城项目第1战之整合Struts2.Hibernate4.3和Spring4.2>我们搭建好了Struts2.Hibernate和Spring的开发环境,并成功将它们整合在一起.这节主要完成一些基本的增删改查以及Service.Dao和Action的抽取.1. Service层的抽取        上一节中,我们在service层简单写了save和update方法,这里我们开始完善该部分的代码,然后对service层的代码进行抽取.1.1 完善CategoryServic

MongoDB入门教程之细说MongoDB数据库的增删查改操作_MongoDB

      看过上一篇,相信大家都会知道如何开启mongodb了,这篇就细说下其中的增删查改,首先当我们用上一篇同样的方式打开mongodb,突然 傻眼了,擦,竟然开启不了,仔细观察"划线区域"的信息,发现db文件夹下有一个类似的"lock file"阻止了mongodb的开启,接下来我们要做的就 是干掉它,之后,开启成功,关于mongodb的管理方式将在后续文章分享.  一: Insert操作      上一篇也说过,文档是采用"K-V"格式存

MongoDB中对文档的增删查改基本操作方法总结_MongoDB

插入文档:insert() 方法 要插入数据到 MongoDB 集合,需要使用 MongoDB 的  insert() 或 save() 方法. 语法: insert() 命令的基本语法如下: >db.COLLECTION_NAME.insert(document) 例子:  >db.mycol.insert({    _id: ObjectId(7df78ad8902c),    title: 'MongoDB Overview',     description: 'MongoDB is