大话数据结构—顺序表、有序表、线性索引查找

查找

根据给定的某个值,在查找表中确定一个其关键字(唯一的标识一个记录)等于给定值的数据元素或数据记录。

静态查找:只查找,不修改元素[线性表、顺序查找、二分查找]

动态查找:查找时,插入或者删除元素[二叉排序树]



顺序表查找

顺序查找(针对静态查找表),也叫线性查找O(n),从头开始遍历,直到最后一个记录。

优化:添加哨兵

//有哨兵的顺序查找
int foo(int *a,int n,int key)
{
    int i;
    a[0]=key;//哨兵
    i=n;
    while(a[i]!=key)
    {
        i--;
    }
    return i;
}

有序表查找

1.二分查找O(logn):

前提元素有序,原因具有n个节点的完全二叉树的深度为[logn]+1(取下)。尽管不是完全二叉树,但是同样的推导,最坏找到最后一层。

不适合动态查找。

2.插值查找O(logn)

根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法。

二分基础上修改,low+1/2(high-low)中1/2–>(key-a[low])/(a[high]-a[low])(插值公式)

3.斐波那契查找O(logn)

黄金分割原理。

斐波那契数列

//斐波那契查找
int foo(int *a,int n,int key)
{
    int low,high,mid,i,k;
    low=1;
    high=n;
    k=0;
    while(n>F[k]-1)//计算n位于斐波那契数列的位置
        k++;
    for(i=n;i<F[k]-1;i++)//将不满的数值补全
        a[i]=a[n];

    while(low<=high)
    {
        mid=low+F[k-1]-1;//计算当前分隔的下标
        if(key<a[mid])
        {
            high=mid-1;
            k=k-1;
        }else if(key>a[mid])
        {
            low=mid+1;
            k=k-2;
        }else
        {
            if(mid<=n)
                return mid;
            else
                return n;
        }
    }
    return 0;
}

斐波那契查找算法的核心:

  1. 当key=a[mid],成功;
  2. 当key< a[mid],新范围是第low个到第mid-1个,此时范围个数为F[k-1]-1个;
  3. 当key> a[mid],新范围是第m+1个到第high个,此时范围个数为F[k-2]-1个。

平均性能优于二分查找。

有序表查找的三种方法中,二分进行加法与除法运算,插值查找进行复杂的四则运算,而斐波那契查找只是进行最简单加减法运算,在海量数据的查找过程中,这种细微的差别可能会影响最终的查找效率。

三种查找的本质是分隔点的选择不同。

线性索引查找

将索引项集合组织为线性结构,即索引表。

1.稠密索引:每个记录对应一个索引项,索引项按照关键码有序,适合少量数据。

查找时,可用二分,插值等从索引表中查找关键码。

数据量大,意味着索引也得同样的数据集长度规模,不适用。

2.分块索引:块内无序(二分等),块间有序(顺序查找)。每块对应一个索引,

类似图书馆藏书原理。

n个记录的数据集被平均分为m块,每个块中有t条记录。n=mxt。

Lb为查找索引表的平均查找长度。Lb=(m+1)/2,

Lw为块中查找记录的平均查找长度。Lw=(t+1)/2。

分块索引查找的平均查找长度为:

公式依赖n、t两个变量。

最好情况m=t,此时

比顺序查找O(n)快,比二分O(logn)慢。

3.倒排索引

由属性(字段、关键字)的值确定记录的位置。

这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。

由于不是有记录来确定属性值,而是有属性值来确定记录的位置,因而叫倒排索引。

优点:查找记录快

缺点:记录号不定长。

应用:Google、百度搜索引擎。

时间: 2024-08-29 14:09:30

大话数据结构—顺序表、有序表、线性索引查找的相关文章

【学习总结】《大话数据结构》- 第3章-线性表

[学习总结]<大话数据结构>- 总 启示: 线性表:零个或多个数据元素的有限序列. 目录 3.1 开场白 3.2 线性表的定义 3.3 线性表的抽象数据类型 3.4 线性表的顺序存储结构 3.5 顺序存储结构的插入与删除 3.6 线性表的链式存储结构 3.7 单链表的读取 3.8 单链表的插入与删除 3.9 单链表的整表创建 3.10 单链表的整表删除 3.11 单链表结构与顺序存储结构优缺点 3.12 静态链表 3.13 循环链表 3.14 双向链表 3.15 总结回顾 3.16 结尾语 -

数据结构例程——合并有序表

本文针对数据结构基础系列网络课程(2):线性表中第15课时有序表. 问题:有两个有序表LA和LB,将它们合并成一个有序表LC.要求不破坏原有表LA和LB 算法思想: 解法1:用顺序表实现(支持的算法库,及list.h文件,请点击链接-) #include "list.h" void UnionList(SqList *LA,SqList *LB,SqList *&LC) { int i=0,j=0,k=0; //i.j.k分别作为LA.LB.LC的下标 LC=(SqList *

KMP算法学习记录----《大话数据结构》部分匹配表学习部分

如需转载,请保留本文链接. 首先先将<大话数据结构>关于KMP算法的讲解部分贴上,本文不提供下载链接,也不会将电子书作为资料留百度云,需要电子书的各位,请自行寻找电子版. 关于上述的KMP算法种的next数组的推导部分,一直不是很明白,本贴是关于上述部分的学习推导记录. 以书中字符串为例: 1|2|3|4|5|6|7|8|9| a|b|a|b|a|a|a|b|a| 0|1|1|2|3|4|2|2|3| string T = "ababaaaba"; int i = 1;j

顺序表 有序表

template <typename T> class SeqList { protected: T *data; int maxSize; int last; void reSize(int newSize) //ok { maxSize = newSize; T *temp = new T[maxSize]; for (int i = 0; i <= last; i++) temp[i] = data[i]; delete[] data; data = temp; } public:

[数据结构 - 第3章补充] 线性表之双向链表(C语言实现)

一.什么是循环链表? 双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.所以在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前驱. 既然单链表也可以有循环链表,那么双向链表当然也可以是循环表. 线性表的双向链表存储结构如下: typedef int ElemType; typedef struct DulNode { ElemType data; //数据域 DulNode *prior; //指向前驱结点的指针 DulN

【Java】 大话数据结构(6) 线性表之栈

本文根据<大话数据结构>一书,实现了Java版的栈的顺序存储结构.两栈共享空间.栈的链式存储机构. 栈:限定仅在表尾进行插入和删除操作的线性表. 栈的插入(进栈)和删除(出栈)操作如下图所示.   1.栈的顺序存储结构 用数组存放数据,top变量来指示栈顶元素在数组中的位置(栈顶指针).一个长度为5的栈的示意图如下: 实现程序: /** * 栈的顺序储存结构 * * 问题:构造器中,泛型数组创建是否有更好的方法? * @author Yongh * */ public class SqStac

大话数据结构---顺序存储结构的线性表

线性表的定义:零个或多个数据元素的有限序列. 定义的解读: 首先是由一组数据元素组成,可以基本数据类型,也可以使自定义的类型, 有限的个数,当然可以是0个,也就是空表呗, 还有一个特点就是有序 这么一看线性表抽象出来就和生活中的排队一样,一群小朋友站成一队,每个人都知道自己站在第几个,自己的前面是谁,后面谁,除了排头排位的两个数据,每个数据都有唯一的前驱和后继. 线性表的分类 今天先学习一下顺序存储结构,顺序存储结构指的就是用一段地址连续的存储单元依次存储线性表的数据元素: 这么一看线性表挺像数

自学数据结构——顺序线性表

胡乱写了一些代码 /* ============================================================================ Name : sqlist.c Author :codecup Version : Copyright : Your copyright notice Description : Hello World in C, Ansi-style ==========================================

小猪的数据结构辅助教程——2.1 线性表中的顺序表

小猪的数据结构辅助教程--2.1 线性表中的顺序表 标签(空格分隔): 数据结构 本节学习路线图与学习要点 学习要点: 1.抽象数据类型(ADT)的概念,三要素:数据,数据元素间的关系和数据的操作 2.线性表的特点:按照一条线排列的数据集合,1对1,除了首元和尾元,其他元素都有直接前驱和直接后继 3.牢记线性表的存储结构,要理解并熟悉12个基本操作的逻辑,最好能徒手撕出代码 4.求并集,顺序表的经典例子,必须掌握! 1.抽象的数据类型 简单点说: 抽象:有点像我们面向对象语言中的类的思想,将事物