数据结构_2 查找

线性查找分为顺序查找、折半查找。

顺序查找:

折半查找: 

第一: 数组必须有序,不是有序就必须让其有序。

第二: 这种查找只限于线性的顺序存储结构。  

  •     线性查找时间复杂度:O(n);
  • 折半无序(用快排或堆排)的时间复杂度:O(NlogN)+O(logN);
  • 折半有序的时间复杂度:O(logN);

哈希查找:

①:  key尽可能的分散,也就是我丢一个“6”和“5”给你,你都返回一个“2”,那么这样的哈希函数不尽完美。

②: 哈希函数尽可能的简单,也就是说丢一个“6”给你,你哈希函数要搞1小时才能给我,这样也是不好的。第一种:”直接定址法“。

常用的做哈希的手法有“五种”: 

第一种:”直接定址法“。

key=Value+C; 这个“C"是常量。

  第二种:“除法取余法”。

很容易理解, key=value%C;解释同上。

  第三种:“数字分析法”。

  第四种:“平方取中法”。

  第五种:“折叠法”。

解决冲突常用的手法也就2种:

  第一种: “开放地址法“。

所谓”开放地址“,其实就是数组中未使用的地址。也就是说,在发生冲突的地方,后到的那个元素(可采用两种方式:①线性探测,②函数探测)向数组后寻找"开放地址“然后把自己插进入。

  第二种:”链接法“。

在每个元素上放一个”指针域“,在发生冲突的地方,后到的那个元素将自己的数据域抛给冲突中的元素,此时冲突的地方就形成了一个链表。

哈希查找时间复杂度O(1)。

索引查找:

  第一:主表

  第二:索引项,一般我们会用函数将一个主表划分成几个子表,每个子表建立一个索引,这个索引叫做索引项。

  第三:索引表,索引项的集合也就是索引表。

  一般“索引项”包含三种内容:index,start,length

  1.      index,也就是索引指向主表的关键字。
  2.   start, 也就是index在主表中的位置。
  3.   length, 也就是子表的区间长度。

索引查找时间复杂度O(n)+O(length)

二叉排序树:

  1.   若根节点有左子树,则左子树的所有节点都比根节点小。
  2. 若根节点有右子树,则右子树的所有节点都比根节点大小。

  插入操作:O(LogN)。

删除操作:O(LogN)。

查找操作:O(LogN)。

时间: 2024-08-04 02:13:44

数据结构_2 查找的相关文章

数据结构 - 静态查找

查找 主要讨论顺序表.有序表.索引表和哈希表查找的各种实现方法,以及相应查找方法在等概率情况下的平均查找长度. 查找表(Search Table):相同类型的数据元素(对象)组成的集合,每个元素通常由若干数据项构成. 关键字(Key,码):数据元素中某个(或几个)数据项的值,它可以标识一个数据元素.若关键字能唯一标识一个数据元素,则关键字称为主关键字(Primary Key) :将能标识若干个数据元素的关键字称为次关键字(Secondary Key) . 查找/检索(Searching):根据给

数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找.本篇博客会给出相应查找算法的示意图以及相关代码,并且给出相应的测试用例.当然本篇博客依然会使用面向对象语言Swift来实现相应的Demo,并且会在github上进行相关Demo的分享. 查找在生活中是比较常见的,本篇博客所涉及的这几种查找都是基于线性结构的查找.也就是说我们的查找表是一个线性表,我

数据结构——二分查找【转】

转自: http://www.lishiyu.cn/post/45.html 二分法(折半查找) -----------效率高,但要求序列必须有序-->使用范围小了 15/2取7不是8 /* * 二分查找算法 --- 递归算法 * */ int binSearch( int array[], int low ,int high, int key) { if(low<=high) { int mid =(low + high)/2; if(key == array[mid]) return mi

数据结构_2

回顾前一篇: 数据结构的作用是按照一定的规则管理和操作数据,有利于程序的编写. 顺序表最简单的可以用数组来实现.可以动态地静态地定义一张顺序表,而数组是以静态定义的.静态定义所分配的内存空间是在栈上的,固定且连续的,不可改动.动态定义所分配的空间是在堆上的,可操作的.当然也是连续的,可以进行扩展(不能缩小吧?),使用完毕后需手动释放,系统不会自动回收,与静态不同. 生成一张顺序表→插入元素→删除元素→系统自动回收/手动释放 对链表的操作和顺序表含义是一致的.静态链表的话类似于数组,结点都由程序定

数据结构之查找算法

查找算法    一.查找的基本概念 查找,也可称检索,是在大量的数据元素中找到某个特定的数据元素而进行的工作.查找是一种操作. 二.顺序查找 针对无序序列的一种最简单的查找方式. 时间复杂度为O(n). 三.二分查找(折半查找) 针对已排序序列的一种查找方式.并且只适用于顺序存储结构的序列.要求序列中的元素基本不变,在需要做删除和插入操作的时候,会影响检索效率. 时间复杂度为O(logN). 四.B树查找 B树又称二叉排序树(Binary Sort Tree). 1.概念:   它或者是一棵空树

数据结构之查找(php代码实现)

/**  * Search_Seq($arr,$elem):顺序查找  * Search_Seq2($arr,$elem):顺序查找(优化)  * Search_bin($arr,$elem):二分查找  * SearchBST($elem):二叉搜索  */ class Search{     public $arr;     function __construct($arr)     {         $this->arr = $arr;     }     /**      * 顺序查

数据结构 - 动态查找

动态查找 当查找表以顺序存储结构存储且需要保持有序时,若对查找表进行插入.删除或排序操作,就必须移动大量的记录,当记录数很多时,这种移动的代价很大. 若查找表无序,则插入删除可无需移动大量记录,但于查找不利. 利用树的形式组织查找表,可以对查找表进行动态高效的查找. 二叉排序树 二叉排序树(Binary Sort Tree或Binary Search Tree) 的定义为:二叉排序树或者是空树,或者是满足下列性质的二叉树. (1) :若左子树不为空,则左子树上所有结点的值(关键字)都小于根结点的

[数据结构]二分查找

1,二分查找: 点击打开链接 [cpp] view plaincopy int Find(int arr[], int key,int length) { assert(arr!=NULL&&length>0); int low=0,high=length,mid; while(low<=high) { mid=(low+high)/2; if(arr[mid]==key) return mid; else { if(arr[mid]>key) high=mid-1; e

数据结构之查找算法总结笔记

查找算法    一.查找的基本概念 查找,也可称检索,是在大量的数据元素中找到某个特定的数据元素而进行的工作.查找是一种操作. 二.顺序查找 针对无序序列的一种最简单的查找方式. 时间复杂度为O(n). 三.折半查找 针对已排序序列的一种查找方式.并且只适用于顺序存储结构的序列.要求序列中的元素基本不变,在需要做删除和插入操作的时候,会影响检索效率. 时间复杂度为O(logN). 四.B树 B树又称二叉排序树(Binary Sort Tree). 1.概念:   它或者是一棵空树:或者是具有下列