目录
前言
线性表查找
1.无序表查找
2.无序表查找
3.分块查找
前言
前面我们已经学习过了相关数据结构的知识,那么今天我们就开始去学习数据的查找,在不同的数据结构里面去查找目标数据,这就是数据的查找算法。今天就从线性结构的表去查找数据元素开始学习。
线性表查找
在此之前我们学习过的线性表有顺序表,链表,栈和队列,这些都是线性结构的数据结构,这里我们要想在这些数据结构里面查找到我们想要的数据元素,就叫做线性表查找。具体的线性表查找又分以下部分查找方式
- 无序线性表查找
- 有序线性表查找
- 局部分块查找
下面我就来一一介绍这三种查找方式。
1.无序表查找
无序表查找又称作为顺序查找,也就是从线性表的起始位置开始,逐个比较元素,直到找到目标元素或遍历完整个线性表。 顺序查找适用于无序线性表和小规模的有序线性表,时间复杂度为O (n)。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef struct data {
int key;//关键字
//…………
}Datatype;
typedef struct table {
Datatype* data;
int length;
}Stable;
//创建初始化表
Stable* Create_inittable(int m) {
Stable* table = (Stable*)malloc(sizeof(Stable));
assert(table);
table->data = (Datatype*)malloc(sizeof(Datatype) * m);
assert(table->data);
//初始化key为-1
for (int i = 0; i < m; i++) {
table->data[i].key = -1;
}
table->length = 0;
return table;
}
//p插入数据
void insert_data(Stable table, Datatype data, int p) {
if (table.data[p].key!=-1) {
return;
}
table.data[p].key = data.key;
}
//查找
int search_key(Stable table, int key) {
for (int i = 0; i < table.length; i++) {
if (table.data[i].key == key)
return i;//找到了就返回这个位置
}
return -1;//没找到
}
这种查找方式说白了就是从头开始去查找,一个一个找,如果数据量很大的情况下,是非常耗时间的。
2.无序表查找
无序表查找又称作为二分查找,仅适用于有序线性表。 首先将线性表按照某种规则进行排序,然后通过比较目标元素与中间元素的大小关系,将查找范围缩小一半,重复这个过程直到找到目标元素或确定目标元素不存在。 二分查找的时间复杂度为O (logn)。
#include<stdio.h>
//折半查找(有序的) log2n+ 1 顺序储存结构
int binary_search(int* key, int target,int n) {
int left = 0;
int right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (target < key[mid])
right = mid - 1;
else if (target > key[mid])
left = mid + 1;
else
return mid;//返回下标
}
return -1;//没找到
}
int main() {
int key[] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n", binary_search(key, 10, 10));
}
二分查找算法,当且仅当数据有序排列的时候可以去使用,虽然查找效率大大提高,但是数据必须是排好序的才可以,也是有一定的局限性的。
3.分块查找
分块查找又称为 索引顺序查找 ,其数据结构可以简单地描述为:分块查找把线性表分成若干块,每一块中的元素存储顺序是任意的,但是块与块之间必须按照关键字大小有序排列,即前一块中的最大关键字要小于后一块的最小关键字。
分块查找类似于查字典,如果你要去查某一个单词的时候,首先去看这个单词的首字母,然后找到相对应的区域,再接着往下查找。
条件(查找过程)
1、将表分成几块,且表或者有序,或者分块有序;
若i<j,则第j块中所有记录的关键字均大于第i块中的最大关键字。
2、建立“索引表”(每个结点含有最大关键字域和指向本
块第一个结点的指针,且按关键字有序)。
以上就是本期的全部内容了,我们下次见!
分享一张壁纸: