链表 算法-用链表实现超级跳表,在O( log n )内查找第n个元素

问题描述

用链表实现超级跳表,在O( log n )内查找第n个元素

2.2 如果有一个表从不修改,那么就可以使用一种更简单的方法来实现表的元素的查找。为了有效地访问第i个元素,向单链表的每个元素中添加第二个指针,使其指向表中其它元素来减少查找所需时间。
(1) 请设计这样的“超级跳表”数据结构,请写出查找第i个元素的伪代码;
(2) 分析上述算法的时间代价,说明它是O( log n )时间的。
注意:本题必须用链表实现,不允许用数组,也不允许用二叉树。

时间: 2024-11-01 23:04:02

链表 算法-用链表实现超级跳表,在O( log n )内查找第n个元素的相关文章

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

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

算法-单链表做线性表的存储

问题描述 单链表做线性表的存储 以带头结点的单链表做线性表的存储表示,编写算法删除表中的偶数序号结点,使(a1,a2,a3,a4,a5...)变成(a1,a3,a5...) 解决方案 #include<stdio.h> #include<malloc.h> typedef struct LNode { int data; struct LNode *next; }*LinkList; LinkList Creat_List(int n) { LinkList head,p,q; h

翻转链表算法和实现

1 翻转思路 1-1 整体的思路 1-2 详细的思路 2 代码实现 3 运行结果 写个翻转链表算法,刚开始想到一个不错的思路.这个思路运行效率不低,时间复杂度为O(n):可以不用分配额外的节点空间,空间复杂度为O(0).现在把思路整理一下,并实现代码,测试运行结果. 1. 翻转思路 1-1 整体的思路 用一个while顺序遍历这个链表,然后把遍历到每个节点插入到链表头部. 1-2 详细的思路 蓝色箭头即赋值符号,比如在第2个结点的操作: step 2.1:front指针前移一位: step 2.

Reverse反转算法+斐波那契数列递归+Reverse反转单链表算法--C++实现

Reverse反转算法 1 #include <iostream> 2 3 using namespace std; 4 //交换的函数 5 void replaced(int &a,int &b){ 6 int t = a; 7 a = b; 8 b = t; 9 } 10 //反转 11 void reversed(int a[],int length){ 12 int left = 0; 13 int right = length - 1; 14 while (left

《算法基础》——3.5 链表算法

3.5 链表算法 到目前为止,本章描述了一些用于建立和维护链表的算法,包括在链表的开头.结尾和中间添加项的算法,查找链表中项的算法和从链表中删除项的算法. 以下各节描述了利用其他方式来操作链表的算法.3.5.1 复制链表 一些算法重新排列链表.本节和下一节将描述一些对链表中的项进行排序的算法.如果想保持原来链表的顺序,就必须在排序之前就做一个该链表的副本. 下面的伪代码演示了如何复制一个单链表: 该算法相当简单,但有一点值得一提:该算法使用last_added来跟踪最新被加入到链表副本中的单元格

Python实现的数据结构与算法之链表详解_python

本文实例讲述了Python实现的数据结构与算法之链表.分享给大家供大家参考.具体分析如下: 一.概述 链表(linked list)是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接. 根据结构的不同,链表可以分为单向链表.单向循环链表.双向链表.双向循环链表等.其中,单向链表和单向循环链表的结构如下图所示: 二.ADT 这里只考虑单向循环链表ADT,其他类型的链表ADT大同小异.单向循环链表ADT(抽象数据类型)一般提供以下接口: ① SinCycLin

浅谈算法和数据结构 六 符号表及其基本实现

前面几篇文章介绍了基本的排序算法,排序通常是查找的前奏操作.从本文开始介绍基本的查找算法. 在介绍查找算法,首先需要了解符号表这一抽象数据结构,本文首先介绍了什么是符号表,以及这一抽象数据结构的的API,然后介绍了两种简单的符号表的实现方式. 一符号表 在开始介绍查找算法之前,我们需要定义一个名为符号表(Symbol Table)的抽象数据结构,该数据结构类似我们再C#中使用的Dictionary,他是对具有键值对元素的一种抽象,每一个元素都有一个key和value,我们可以往里面添加key,v

算法与数据结构之顺序表顺序表

著名的计算机科学家N.Wirth教授曾提出一个公式:算法+数据结构=程序 "数组"类型表示顺序存储结构,用指针来表示链式存储结构.指针p指向下一个对象单元,p的值不是一增加1,而是增加对象类型所占的字节数. 一个结构提示类型student,没有定义变量,就不会分配存储单元,不能再程序中直接访问结构体类型名. 线性表是N个具有相同特性的数据元素的有限序列.线性表分为 顺序存储结构和链式存储结构. 顺序表: /*顺序表的建立与输出*/ #include<stdio.h>#inc

JavaScript实现链表插入排序和链表归并排序_JSP编程

本篇文章详细的介绍了JavaScript实现链表插入排序和链表归并排序,链表的归并排序就是对每个部分都进行归并排序,然后合并在一起. 1.链表 1.1链表的存储表示 //链表的存储表示 typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode, *LinkList; 1.2基本操作 创建链表: /* * 创建链表. * 形参num为链表的长度,函数返回链表的头指针. */ Link