数据查找(search)-----线性表查找

目录

前言

线性表查找

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为-1for (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;elsereturn 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、建立“索引表”(每个结点含有最大关键字域和指向本

        块第一个结点的指针,且按关键字有序)。

 以上就是本期的全部内容了,我们下次见!

分享一张壁纸:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/155522.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【进阶C语言】数组笔试题解析

本节内容以刷题为主&#xff0c;大致目录&#xff1a; 1.一维数组 2.字符数组 3.二维数组 学完后&#xff0c;你将对数组有了更全面的认识 在刷关于数组的题目前&#xff0c;我们先认识一下数组名&#xff1a; 数组名的意义&#xff1a;表示数组首元素的地址 但是有两个例外…

Xposed hook 抖音首页标签隐藏

Xposed hook 抖音首页标签隐藏 本篇文章主要使用xposed hook arraylist,来实现 抖音首页部分标签条目隐藏。 直接上代码&#xff1a; //隐藏首页tab XposedHelpers.findAndHookMethod(ArrayList.class, "add", Object.class, new XC_MethodHook() {Overrideprotect…

HTML标签、CSS介绍

标签的分类: 块级/行内 # 块级标签: 独占一行 h1~h6 p div """ 块儿级标签可以修改长宽. 行内标签不可以, 就算修改了也不会变化.块级标签内部可以嵌套任意的块级标签和行内标签. 特例: 是p标签虽然是块级标签 但是它只能嵌套行内标签 不能嵌套块级标签. 如…

VINS-Mono-VIO初始化 (五:视觉惯性对齐求解)

整体思想就是根据预积分的公式&#xff0c;把已知量和未知量各放到一边&#xff0c;因为前面的数据都是变换到 c 0 c_{0} c0​下的&#xff0c;不是真正意义上和重力对齐的世界坐标&#xff0c;然后位移和速度的预积分中会用到加速度计获取的重力加速度g&#xff0c;但是这个重…

深入理解udp

1.再谈端口号 1.1复习 我们上一篇谈了很久的应用层的http&#xff0c;并在此前我们使用socket编程写了一个能相互通信的客户端与服务端&#xff0c;但是我们也只是粗略的理解了一下tcp和udp在编程过程中所形成的差异性&#xff0c;并没有实质去了解一下其详细内容&#xff0c;…

三维地图数据共享与统一存储

这家总部位于北京的高新企业是一家致力于三维数字地理技术的领军企业&#xff0c;提供中国领先的三维数据获取服务&#xff0c;并依据三维数据自动建模云计算服务、提供全国性的地图与位置服务。这项技术其实我们每天都有可能用到&#xff0c;例如百度地图、高德地图就属于三维…

数据结构——线性表①(顺序表)

一、线性表定义 线性表是一种数据结构&#xff0c;它是由n个具有相同数据类型的数据元素a1,a2,…,an组成的有限序列。 其中&#xff0c;除第一个元素a1外&#xff0c;每一个元素有且只有一个直接前驱元素&#xff0c;除了最后一个元素an外&#xff0c;每一个元素有且只有一个…

处理固定资产折旧报错 AFAB “根据记帐循环, 您必须接下来对期间 001记帐”

会计在运用进行固定资产折旧时&#xff0c;发现有个报错“根据记帐循环, 您必须接下来对期间 001记帐”&#xff0c; 根据记帐循环, 您必须接下来对期间 001记帐 消息编号 AA683 诊断 不可以在指定的期间过帐折旧&#xff0c;因为此操作会遗漏过帐期间。 系统响应 该期间不能进…

多输入多输出 | Matlab实现k-means-ELM(k均值聚类结合极限学习机)多输入多输出组合预测

多输入多输出 | Matlab实现k-means-ELM&#xff08;k均值聚类结合极限学习机&#xff09;多输入多输出组合预测 目录 多输入多输出 | Matlab实现k-means-ELM&#xff08;k均值聚类结合极限学习机&#xff09;多输入多输出组合预测预测效果基本描述程序设计参考资料 预测效果 基…

ATECLOUD如何进行电源模块各项性能指标的测试?

ATECLOUD平台进行电源模块各项性能指标的测试是通过以下步骤实现的&#xff1a; 连接测试设备&#xff1a;将测试设备与云计算服务器连接&#xff0c;实现数据采集和远程控制。测试设备包括示波器、电子负载、电源、万用表等&#xff0c;这些设备通过纳米BOX连接到云测试平台上…

力扣刷题-栈-逆波兰表达式求值

150. 逆波兰表达式求值 根据 逆波兰表示法&#xff0c;求表达式的值。 有效的运算符包括 , - , * , / 。每个运算对象可以是整数&#xff0c;也可以是另一个逆波兰表达式。 说明&#xff1a; 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说&#xff0c;表达…

NSSCTF做题第十页(1)

[GXYCTF 2019]禁止套娃 看源代码也没什么东西&#xff0c;扫一下看看 发现了git泄露 话不多说直接开整 下载下来了 flag.php 还是代码审计 <?php include "flag.php"; echo "flag在哪里呢&#xff1f;<br>"; if(isset($_GET[exp])){ if (!preg_…