查找算法

大话数据结构学习笔记 - 查找之顺序查找、折半查找、插值查找及斐波那契查找

孤街醉人 提交于 2019-11-29 16:35:38
大话数据结构学习笔记 - 查找之顺序查找、折半查找、插值查找及斐波那契查找 查找( Searching ) : 就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录) 概论 概念 查找表( Search Table ) :由同一类型的数据元素(或记录)构成的集合 关键字( Key ) :数据元素中某个数据项的值,又称为键值,用来标识一个数据元素 主关键字( Primary Key ) :若关键字可以唯一的标识一个记录,则称此关键字为主关键字, 主关键字所在的数据项称为主关键码 次关键字( Secondary Key ) : 可以识别多个数据元素(或记录)的关键字 查找表 静态查找表 静态查找表( Static Search Table ) : 只做查找操作的查找表 查询某个特定数据元素是否在查找表中 检索某个特定数据元素和各种属性 动态查找表 动态查找表( Dynamic Search Table ) : 在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素 查找时插入数据元素 查找时删除数据元素 面向查找操作的数据结构称为查找结构 本文所有代码,示例数组为 {0,1,16,24,35,47,59,62,73,88,99} , 区间为 [1, 10] , 返回下标 0 则表示查找失败 顺序表查找 顺序查找(

查找算法笔记(C++版)

好久不见. 提交于 2019-11-29 16:35:05
查找算法笔记(C++版) 记录最近学习的一些查找算法 目录 查找算法笔记(C++版) 1.顺序查找 2.二分查找 1.顺序查找 时间复杂度:O(n) 代码: //顺序查找 int sequentialSearch ( int * list , int n , int x ) { for ( int i = 0 ; i < n ; i ++ ) { if ( list [ i ] == x ) return i ; } return - 1 ; } 测试代码: int main ( void ) { int list [ ] = { 1 , 3 , 5 , 7 , 9 , 2 , 4 , 6 , 8 , 0 } ; //可以是无序数组 cout << "list[]:" ; for ( int i = 0 ; i < 10 ; i ++ ) cout << list [ i ] << " " ; cout << endl ; int x = 8 ; int i = sequentialSearch ( list , 10 , x ) ; if ( i < 0 ) cout << "未找到" << endl ; else cout << "list[" << i << "]中找到" << x << endl ; return 0 ; } 运行结果: list[]:1 3 5 7 9 2

查找算法学习笔记

故事扮演 提交于 2019-11-29 16:34:53
折半查找 基本过程:在 有序 表中取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。 //arr为待查找的数组,key为要查找的关键字,low和high为需要查找的数组下标的范围 public static int find1(int[] arr, int key, int low, int high) { if (arr != null && arr.Length > 0) { if ((low >= 0 && low <= arr.Length - 1) && (high >= low && high <= arr.Length - 1)) { int mid; while (low <= high) { mid = (low + high) / 2; if (key < arr[mid]) { high = mid - 1; } else if (key > arr[mid]) { low = mid + 1; } else { return mid; } } } } return -1; } 插值查找 基本思想:如果一个有序的序列是均匀分布的

【学习笔记】二分查找

限于喜欢 提交于 2019-11-29 16:34:44
二分查找的学习笔记 之前在bilibili看到一个有趣的视频,关于二分查找的。 戳我看这个有趣的视频 笔记参考:极客时间|数据结构与算法之美 1. 二分思想 就如上面视频中的栗子,猜数字游戏,如果从头开始一个一个的猜是非常低效的。 在实际的开发场景中,假设有1w条订单数据,已经按照订单的金额从小到大排序,每个定干的金额不同,最小单位是元。 如果从第一个订单开始,遍历这1w条订单,直到找到目标为止,这种方法在最坏情况下可能要便利完所有数据才能找到。 但是用二分法,每次都通过跟区间中间元素对比,将整个带查找的区间缩小为之前的一半,直到查找的需要的数据或者区间缩小为0。 2. 二分查找实现(递归和非递归) // 非递归实现 int bsearch ( int a [ ] , int n , int value ) { int low = 0 ; int high = n - 1 ; while ( low <= high ) { int mid = ( low + high ) / 2 ; if ( a [ mid ] == value ) { return mid ; } else if ( a [ mid ] < value ) { low = mid + 1 ; } else { high = mid - 1 ; } } /*while*/ return - 1 ; }

二分法查找(折半查找)算法学习笔记

泪湿孤枕 提交于 2019-11-29 16:34:00
关键:数组中的元素必须是已经排好序的. 一维数组,二分法查找: 假如有一组数为1,2,3,4, 5 ,6,7, 8, 9, 10要查给定的值7.可设三个变量low,mid,high分别指向数据的前,中间和后,mid=(low+high)/2. 思路: 1:将low=0,值为1;high=9,值为10(因为数组下标从0开始);mid=(low+high)/2,即等于4,值为32(因为整型会省略小数点); 2:将mid的值与查找的数作比较,如果mid<n(这里假设要查找的数为n),说明n在mid的后边,则使得low=mid+1,high不变;如果n<mid,说明n在mid的前边,则使得high=mid-1,low不变;如果mid==n,你懂的... 3:现在的mid等于4,值为5,查找的范围为:5,6,7,8,9,10,显然mid<n,此时mid执行2次循环便等于7,然后输出mid. 例如: 设计一个程序,提供用户输入10个整数并保存到数组中,将整数以从大到小的顺序排列,最后通过半分法查找用户输入的值并显示值的序号.(VC++6.0环境) 代码清单: /******************************************************** ************************半分法查找*********************** ********

二分法查找 算法学习笔记

丶灬走出姿态 提交于 2019-11-29 16:31:17
二分法查找 学习笔记 文章目录 二分法查找 学习笔记 二分法简介 这种方法的基本思路如下: 主程序如下 二分法简介 二分法查找,是一种在已经 排好顺序 的数组中查找特定元素的方法。 这种方法的基本思路如下: 数组a[],所寻找的特定元素x。 1、设3个指针: l:指向数组第一个数。 h:指向数组中间数(h = (l + r) / 2)。 r:指向数组最后的数。 2、将x与a[h]作比较, (1) 若a[h] > x :将r指针向前移到h-1; (2) 若a[h] < x :将l指针向后移到h+1; 3、重新定义h指针:h = (l + r) / 2。 将上述步骤写入循环里,当 l < r - 1 时,退出循环。 主程序如下 int l , h , r , num [ m ] , x ; //x为特定元素,m为数组大小 l = 0 ; r = m - 1 ; while ( l < r - 1 ) { h = ( l + r ) / 2 ; if ( x == num [ h ] ) { printf ( "%d" , h ) ; return 0 ; } else if ( x > num [ h ] ) { l = h + 1 ; } else { r = h - 1 ; } } 来源: CSDN 作者: 摇啊摇曳瑶 链接: https://blog.csdn.net

算法查找学习笔记

倖福魔咒の 提交于 2019-11-29 16:31:03
一.如果在一个没排好序数据中查找就用普通查找就是用循环语句 在排好序的数据查找 一.二分法查找 1.在程序中首先找到中间元素 当大于中间元素时 开始位置=中间位置+1 当小于中间元素时 结束位置=中间位置-1 一直查找到开始位置大于结束位置 二叉树查找 5 6 4 8 7 3 2 估计二叉是像上面那样的。所以当大于是往左边查找,小于往右边查找 hash查找 hash存储是 index = data % mod; (这是自己定义的hash函数),index为下标存储进去的。所以查找也是根据hash函数找到index的 hash冲突问题: 1.可以用双个hash函数。 2. 线性探测法 位置 1 2 3 4 5 6 7 8 9 数据65 28 98 78 比如要插入30到1位置,原来1位置有数据了冲突了,则就往下查找直到没数据的比如5位置 3.链接法 struct hash { int data; struct hash *p } 当冲突了就再分配一个节点出来用p来指向新分配的节点 程序可以参考: http://blog.csdn.net/feixiaoxing/article/details/6844723 来源: CSDN 作者: 4M小水管 链接: https://blog.csdn.net/ap105638/article/details/8882663

静态查找学习笔记

試著忘記壹切 提交于 2019-11-29 16:30:38
最近在看<大话数据结构>,这本书真是写的好呀呀呀,关于查找做了些笔记. 一.顺序表查找 1. 顺序查找 也称为线性查找,查找过程基本是从第一个(或最后一个)开始查找,逐个与查找值的关键字对比是否相等,若相等查找成功,若到最后都没有没有相等,则查找失败. 时间. 顺序查找优化:即设定一个哨兵,解决了不用每次都要比较. 时间复杂度:O(N). int SequentialSearch ( int * a , int n , int key ) { a [0] = key ; int i = sizeof ( a )/ sizeof ( int ) - 1; // 因 a[0] =key 设定了是哨兵 ; ,当i==0时, a[0] 与 key 必定相等.这也是哨兵的作用 . while ( a [ i ] != key ) { i --; } return i ; } 二. 有序表查找(查找的数据是有序的) ※ 包括折半, 插值, 斐波那契查找. 1. 折半查找 又称二分查找,前提是查找表是有序的. 时间复杂度:O(logN). 查找过程:(1)在有序表中, 取中间值mid与关键字key进行比较,如果mid与key相等,则查 找成功.如果mid < key, 则(2), 如果mid > key,则(3). (2)取mid的左半端(不包括(1)mid)的中间值,转(1). (3

散列表、散列法、拉链法的一些概念

回眸只為那壹抹淺笑 提交于 2019-11-29 12:06:05
散列表、散列法、拉链法的一些概念介绍: 散列表 https://www.cnblogs.com/baxianhua/p/9244769.html 散列表也叫hash表 ,是根据关键码值而进行直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射也叫散列函数,存放记录的数组叫散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则成表M为Hash表,函数f(key)为哈希函数。 散列表有哪些特点? HashMap具有优秀的查找性能。根据key找到value,性能最好的算法!(没有之一)。无论数据多少,查找方法的性能始终如一!为了实现根据key告诉找到value,散列表提供了高性能查找算法。利用散列数组算法进行散列查找,性能很好。无论数据量有多少,都会在一个固定的时间,找回结果!甚至是在亿级别数据量上进行查找!凡是软件中需要查找根据key查找到value时,一定使用散列表。 使用散列表的注意事项: ①key-value成对数据添加到散列表 ②key不可以重复,value可以重复 ③key-value规定为一个条目(Entry) ④散列表中散列数组的大小称为容量 ⑤key-value数量称为size ⑥size/容量称为加载因子,要小于75%,如果大于75%,会自动扩容

纯JS实现在一个字符串b中查找另一个字符串a出现的所有位置,并且不使用字符串的方法(递归)

谁说我不能喝 提交于 2019-11-29 10:33:40
问题:判断字符串A在中所有出现字符串B中(长度大于1)的索引。不得使用字符串方法indexof,substring等    有小伙伴在面试遇到了这个问题,乍一看如果使用使用字符串方法indexof,substring,很简单容易实现,但如果不使用这些方法,怎么样才能实现这个需求呢     // 思路: 如果不能使用字符串的相应方法,我们可以把字符串转换成数组,使用递归函数不断去比对相应的数组索引,然后把满足条件的索引打印出来,其实很多现在前后端交互处理数据的方法,用的都是递归偏多,千万别小瞧递归! 话不多说,我们先上解决问题的方法: <script> // 其实很多现在前后端交互处理数据的方法,用的都是递归变多,千万别小瞧递归 // 思路: 不能使用字符串的相应方法,我们可以把字符串转换成数组,首先使用递归不断去比对相应的数组索引 // 随机的字符 var str1 = 'adfacddtgjacbasaclsaacdctacw'; // 条件筛选的字符 var str2 = 'basaclsa'; // 把相应的字符串转换为数组 var arr1 = str1.split(''); var arr2 = str2.split(''); function test (arr) { // 写一个for循环,先把需要筛选的数组arr2第一个索引拿来比对 for(var i = 0; i