顺序查找

数据结构之查找运算

Deadly 提交于 2019-12-20 07:26:38
查找运算 查找 线性表的查找 顺序查找(都是从后往前找) 折半查找(二分查找) 分块查找(索引顺序查找) 数表的查找 哈希表(散列表的查找) 查找 查找表可分为两类 静态查找表 仅作查询和检索操作的查找表。 动态查找表 有时在查询之后,还需要将“查询”结果为“不在查找表中”的数据元素插入到查找表中;或者,从查找表中删除其“查询”结果为“在查找表中”的数据元素。 关键字 是数据元素(或记录)中某个 数据项 的值,用以标识(识别)一个数据元素(或记录)。 若此关键字可以识别唯一的一个记录,则称之谓“主关键字”。 若此关键字能识别若干记录,则称 之谓“次关键字”。 线性表的查找 顺序查找(都是从后往前找) 顺序查找方法既适用于线性表的 顺序存储结构 ,又适用于线性表的 链式存储结构 。( 无序 ) 时间复杂度为O(n)。 在不等概率查找的情况下,ASLss 在 Pn≥Pn-1≥···≥P2≥P1时取极小值 若查找概率无法事先测定,则查找过程采取的改进办法是,在每次查找之后,将刚刚查找到的记录直接移至表尾的位置上。 折半查找(二分查找) 折半查找要求线性表必须才用 顺序存储结构 ,而且表中元素按关键字 有序 排列。 时间复杂度为O(log2 n)。 算法步骤: 置查找区间初值,low为1,high为表长。 当low小于等于high时,循环执行以下操作: mid取值为low和high的中间值

DS静态查找- 顺序-二分-索引

女生的网名这么多〃 提交于 2019-12-18 22:50:21
静态查找 静态表是只执行查找操作,而不执行插入、删除等操作的表。 现在常说的有五大查找方法:顺序查找、分块查找、索引查找、树查找、哈希查找。 后两种之前写过了二叉查找树和哈希表,现在回顾前面三种,它们都属于顺序表查找。 1.顺序查找 思路最简单的查找,也就是遍历一遍看看有没有相等的元素。 可以设置一个哨兵,这样全都不相等也可以在哨兵那里返回,不必设边界条件。 int find(T key){ data[0] =key;//监视哨 //因为就算前面碰不到匹配的在0这里也会返回0,就不需要特别判断边界条件 for(int i=len;i>=0;i--){ if(data[i]==key) return i; } } 2.二分查找 二分查找的对象必须是有序表,以递增序列为例,我们先找到中间的那个元素,若是该元素比key值小,则下一步只需要查找左边的,否则下一步只需要查找右边的。 显然我们可以发现,分块查找的比较次数要小于顺序查找。 int find_half(T key){ int low =1; int high = len; while(low<=high){ cout<<data[(low+high)/2]<<" "<<key <<endl; if(data[(low+high)/2]==key) return (low+high)/2; else if(data[(low

数据结构——查找和排序部分整理

雨燕双飞 提交于 2019-12-18 02:34:31
查找 查找:静态查找、动态查找、哈希查找 静态查找:顺序查找、折半查找(二分查找)、索引顺序查找(分块查找) 顺序查找:ASL=1/2(n+1)平均查找长度 折半查找:ASL可以将所给序列画成类似完全二叉树,根据每层点个数*所在层数之和。 索引查找:块间有序,块内无序ASL=1/2(b+1)+1/2(s+1). 动态查找:二叉排序树(二叉查找树)、B-/B+树 二叉排序树:动态查找高效, 同一组关键字构造的二叉排序树,形态不一定相同,ASL也不一定相同(给定顺序了,就唯一了) 它的ASL画图计算 B-树:多路查找树 一颗m阶B-树是m叉平衡二叉树,树中每个节点最多m棵子树。 哈希表:构造方法、处理冲突方法 处理冲突方法:1、开放定址法:线性探测再散列(d= 1,2,3…m-1)、二次探测再散列(d=1,-1,4,-4,9,-9)、伪随机探测再散列(其中有一种双散列探测)2、再哈希 3、链地址法 哈希函数好坏取决于:哈希函数、处理冲突方式、装填因子a(a=填入记录长度/哈希表长度) 排序 排序:插入排序、“交换”排序、选择排序、归并排序 插入排序:直接插入、希尔排序(间距d) “交换”排序:冒泡排序、快速排序 选择排序:简单选择排序、堆排序 来源: CSDN 作者: weixin_44040169 链接: https://blog.csdn.net/weixin_44040169

顺序查找与折半查找

核能气质少年 提交于 2019-12-17 04:25:08
顺序查找(线性查找) 依次进行比较,相等即查找成功 int LinSearch ( long num [ ] , long x , int n ) { int i ; for ( i = 0 ; i < n ; i ++ ) { if ( num [ i ] == x ) return i ; //找到时返回下标位置 } return - 1 ; //找不到时返回-1 } 折半查找(二分查找) 一直选择居中间位置的数与所要查找的数进行比较 只能在有序的数据中进行查找 int BinSearch ( long num [ ] , long x , int n ) { int low , high , mid ; low = 0 ; high = n - 1 ; while ( low < high ) { mid = ( high + low ) / 2 ; if ( x > num [ mid ] ) //两个数作比较 low = mid + 1 ; else if ( x < num [ mid ] ) //两个数作比较 high = mid - 1 ; else return mid; //直接找到所要查找的数 } return - 1 ; //找不到则返回-1 } 来源: CSDN 作者: Mr.毛~ 链接: https://blog.csdn.net/qq_45727728

查找技术

喜夏-厌秋 提交于 2019-12-16 22:31:57
一、查找的基本概念 1.列表:由同一类型的数据元素组成的集合。 关键码:数据元素中的某个数据项,可以标识列表中的一个或一组数据元素。 键值:关键码的值。 主关键码:可以唯一地标识一个记录的关键码。 次关键码:不能唯一地标识一个记录的关键码。 2.查找 :在具有相同类型的记录构成的集合中找出满足给定条件的记录。 查找的结果 :若在查找集合中找到了与给定值相匹配的记录,则称查找成功;否则,称查找失败。 3.静态查找 :不涉及插入和删除操作的查找 。 动态查找 :涉及插入和删除操作的查找。 静态查找适用于:查找集合一经生成,便只对其进行查找,而不进行插入和删除操作; 或经过一段时间的查找之后,集中地进行插入和删除等修改操作; 动态查找适用于:查找与插入和删除操作在同一个阶段进行,例如当查找成功时,要删除查找到的记录,当查找不成功时,要插入被查找的记录。 4.查找结构 :面向查找操作的数据结构 ,即查找基于的数据结构。 线性表:适用于静态查找,主要采用顺序查找技术、折半查找技术。 树表:适用于动态查找,主要采用二叉排序树的查找技术。 散列表:静态查找和动态查找均适用,主要采用散列技术。 二、线性表的查找技术 1.普通的顺序查找 基本思想: 从线性表的一端向另一端逐个将关键码与给定值进行比较, 若相等,则查找成功,给出该记录在表中的位置; 若整个表检测完仍未找到与给定值相等的关键码

县城模版~顺序查找函数模版

独自空忆成欢 提交于 2019-12-16 11:16:14
顺序查找函数模版: # include <iostream> using namespace std ; template < class T > int seqSearch ( const T list [ ] , int n , const T & key ) { for ( int i = 0 ; i < n ; i ++ ) if ( list [ i ] == key ) return i ; return - 1 ; } int main ( ) { return 0 ; } 本人技术水平有限,若有错误或不当之处,可以在本号内反馈给我,一起交流一起学习!! 来源: CSDN 作者: 孟享广 链接: https://blog.csdn.net/weixin_45826012/article/details/103483698

java 查找算法

*爱你&永不变心* 提交于 2019-12-06 20:46:31
1、顺序查找 public class OrderSearch { /**顺序查找平均时间复杂度 O(n) * @param searchKey 要查找的值 * @param array 数组(从这个数组中查找) * @return 查找结果(数组的下标位置) */ public static int orderSearch(int searchKey,int... array){ for(int i=0;i<array.length;i++){ if(array[i]==searchKey){ return i; } } return -1; } /**测试查找结果 * @param args */ public static void main(String[] args) { int[] test=new int[]{1,2,29,3,95,3,5,6,7,9,12};//升序序列 int index=OrderSearch.orderSearch(95, test); System.out.println("查找到的位置 :"+ index); } } 二分查找 算法思想:又叫折半查找, 要求待查找的序列有序 。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程

DS静态查找- 顺序-分块-索引

喜你入骨 提交于 2019-12-06 19:43:33
静态查找 静态表是只执行查找操作,而不执行插入、删除等操作的表。 现在常说的有五大查找方法:顺序查找、分块查找、索引查找、树查找、哈希查找。 后两种之前写过了二叉查找树和哈希表,现在回顾前面三种,它们都属于顺序表查找。 1.顺序查找 思路最简单的查找,也就是遍历一遍看看有没有相等的元素。 可以设置一个哨兵,这样全都不相等也可以在哨兵那里返回,不必设边界条件。 int find(T key){ data[0] =key;//监视哨 //因为就算前面碰不到匹配的在0这里也会返回0,就不需要特别判断边界条件 for(int i=len;i>=0;i--){ if(data[i]==key) return i; } } 2.分块查找 分块查找的对象必须是有序表,以递增序列为例,我们先找到中间的那个元素,若是该元素比key值小,则下一步只需要查找左边的,否则下一步只需要查找右边的。 显然我们可以发现,分块查找的比较次数要小于顺序查找。 int find_half(T key){ int low =1; int high = len; while(low<=high){ cout<<data[(low+high)/2]<<" "<<key <<endl; if(data[(low+high)/2]==key) return (low+high)/2; else if(data[(low

查找 | 顺序查找

余生长醉 提交于 2019-12-05 03:57:46
#include <stdio.h> #define MaxSize 8 typedef struct {   int stuno;   char stuname[20]; }TableElem; TableElem stu[]={{1001,"zhang"},{1009,"wang"},{2005,"sun"},{2008,"liu"},{3001,"zheng"},{3005,"lai"},{4003,"qin"},{4400,"ren"}}; typedef struct {   TableElem elem[MaxSize];   int n; }SqTable; int searchsqtable(SqTable T, int key)//查找函数 {   T.elem[0].stuno=key;   int i=T.n;   while(T.elem[i].stuno!=key)     i--;   return i; } int main() {   SqTable seq;   for(int i=0;i<MaxSize;i++)   {     seq.elem[i]=stu[i];//用stu[8]8个人初始化 elem[8]数组   }   seq.n=MaxSize;   int kk,mm;   printf("请输入要查找的学号:");   scanf

顺序查找

随声附和 提交于 2019-12-04 11:29:10
一个有序列表中查找任意元素的位置,不存在返回-1,如果存在返回它所在的下标: # 顺序查找 # 原始数据 - value # 待查找数据 - key def linear(value, key): # 遍历所有数据 for i in range(len(value)): # 对比 if value[i] == key: # 查找成功, 返回下标值 return i else: # 查找失败 return -1 # 原始数据 values = [3, 6, 9, 1, 4, 7, 8, 2, 10, 5, 11, 13, 12] # 待查找数据 key = 6 # 调用查找函数 res = linear(values, key) if res == -1: print('查找失败') else: print('查找成功,对应下标值:', res) print((0+12) // 2) View Code 来源: https://www.cnblogs.com/lw1095950124/p/11858132.html