重学数据结构系列之——静态查找表查找算法

摘要:
学习来源:Ji Suke 1.理解搜索就是在集合中找到一个元素。集合称为查找表。通常,查找表有四个操作:查找:检查查找表中是否存在特定记录。检索:查找特定记录的各种属性。插入:在查找表中插入不存在的数据元素。删除:从查找表中删除特定元素。如果只对查找表执行前两个操作,则这种类型的查找表称为静态搜索表。创建静态查找表后,不能插入或删除该表,也不能删除该查找表

学习来源:计蒜客

1.认识查找

就是在一个集合里面找到某个元素。集合就叫查找表

通常对查找表有 4 种操作:

查找:在查找表中查看某个特定的记录是否存在
检索:查找某个特定记录的各种属性
插入:将某个不存在的数据元素插入到查找表中

删除:从查找表中删除某个特定元素


如果对查找表只执行前两种操作,则称这类查找表为 静态查找表(static search table)。静态查找表建立以后,就不能再执行插入或删除操作,查找表也不再发生变化。对应的,如果对查找表还要执行后两种操作,则称这类查找表为动态查找表(dynamic search table)


下面的查找算法都是针对静态查找表的,比如顺序查找、折半查找、分块查找等;而对于动态查找表,往往使用二叉平衡树、B-树或哈希表来处理。


2.查找算法的好坏

用平均查找长度来比较(我们当做查找表中的每个元素被查找的概率都是相等的),平均查找长度的计算:将查找每个元素时的比较次数加起来,再除以元素总个数n


3.顺序查找算法

就是跟查找表的每个元素逐一比较,找到就返回索引,找不到返回-1

简单的查找代码:(分为有序表的查找和无序表的查找)下面是有序表的查找,无序的查找把下面的search函数的else if 语句删除即可

时间复杂度O(n)
#include <iostream>
#include <cstring>

using namespace std;

class Vector {
private:
    int size, length;
    int *data;
public:
    Vector(int input_size) {
        size = input_size;
        length = 0;
        data = new int[size];
    }
    ~Vector() {
        delete[] data;
    }
    bool insert(int loc, int value) {
		//插入位置的范围判断
        if (loc < 0 || loc > length) {
            return false;
        }
        if (length >= size) {
			//若当前线性表的长度大于等于容量时,就扩容
            expand();
        }
		//将loc后面的数据全部后移,从最后一个元素开始移
        for (int i = length; i > loc; --i) {
            data[i] = data[i - 1];
        }
		//插入该位置,并长度+1
        data[loc] = value;
        length++;
        return true;
    }
    void expand() {
        int * old_data = data;
        size = size * 2;
        data = new int[size];
        for (int i = 0; i < length; ++i) {
            data[i] = old_data[i];
        }
        delete[] old_data;
    }
    int search(int value) {
		for (int i = 0; i < length; i++) {
			if (data[i] == value) {
				return i;
			}else if (data[i] > value) {
				return -1;
			}
		}
		return -1;
    }
    bool remove(int index) {
        if (index < 0 || index >= length) {
            return false;
        }
        for (int i = index + 1; i < length; ++i) {
            data[i - 1] = data[i];
        }
        length = length - 1;
        return true;
    }
    void print() {
        for (int i = 0; i < length; ++i) {
            if (i > 0) {
                cout << " ";
            }
            cout << data[i];
        }
        cout << endl;
    }
};
int main() {
    Vector a(100);
    a.insert(0, 2);
    a.insert(1, 4);
    a.insert(2, 6);
    a.insert(3, 8);
    a.insert(4, 10);

    cout << a.search(4) << endl;
    cout << a.search(5) << endl;
    return 0;
}

结果:
重学数据结构系列之——静态查找表查找算法第1张


4.有序表查找的优化——折半查找

由于相当于向二叉树那样分叉,时间复杂度就是O(logn)

把上面的search函数改了即可
int search(int value) {
		//初始化二分查找的左右范围
		int left = 0, right = length -1;
		//左边必须小于等于右边
		while (left <= right) {
			int mid = (left + right) / 2;
			if (data[mid] == value) {
				return mid;
			}
			//暂时找不到就相应更新左或右的范围
			else if (data[mid] < value) {
				left = mid + 1;
			}else{
				right = mid -1;
			}
		}
		//来到这说明left > right,查找不成功
		return -1;
    }



免责声明:文章转载自《重学数据结构系列之——静态查找表查找算法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇将图片以字符串方式保存从零开始学习jQuery (十) jQueryUI常用功能实战(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

数据结构学习笔记——线性表

第2章  线性表 2.1  线性表的类型定义  线性结构的特点是:在数据元素的非空有限集中,(1)存在唯一的一个被称做“第一个”的数据元素;(2)存在唯一的一个被称做“最后一个”的数据元素;(3)除第一个之外,集合中的每个数据元素只有一个前驱;(4)除最后一个外,集合中每个数据元素均只有一个后继。 线性表的类型定义 线性表(linear_list)是最常用...

java之static变量与全局、局部变量的区别

static变量与全局、局部变量的区别 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其...

Java 之 类初始化

一、类初始化过程   1、   2、 二、静态代码块   1、作用     Java静态代码块的作用:Java静态代码块中的代码会在类加载JVM时运行,且只被执行一次,也就是说这些代码不需要实例化类就能够被调用。一般情况下,如果有些代码必须在项目启动的时候就执行的时候,就需要使用静态代码块。    Java静态代码块的用法:一个类可以使用不包含在任何方法体...

计组-高速缓存

高速缓存 为了减低成本,增加cpu访问主存的性能,一般都会在主存与cpu之间增加小容量的缓存,可以采用这种方式的一个很主要原因就是程序执行的局部性。 程序的局部性 自我理解程序的局部性就是大多数时候程序都是按照代码一行行的执行可能发生条件转移指令但是程序跳转的范围也不是特别的大。比如for循环情况 for(int i = 0 ; i < 1000 ;...

高性能NoSQL

极客时间:《从 0 开始学架构》:高性能NoSQL 1、引言 关系型数据库凭借着SQL功能和ACID的属性,活跃于各种各样的系统中,但它并不是完美的,其存在以下缺点: 关系数据库存储的是行记录,无法存储数据结构 关系数据库的 schema 扩展很不方便关系数据库的表结构 schema 是强约束,操作不存在的列会报错,业务变化时扩充列也比较麻烦,需要执行...

SQL Server之索引解析(二)

1、堆表 堆表通过IAM连接一起,查询时全表扫描。 1、1 非聚集索引 结构 叶子节点数据结构:行数据结构+Rid(8字节) 中间节点数据结构: (非聚集非唯一索引)行数据结构+Page(4)+2+ Rid(8字节) 中间2字节有疑问? (非聚集唯一索引)行数据结构+分割符?+ Page(4) 堆表非聚集索引结构 1、2 聚集索引表 组织结构 1...