数据结构与算法(5)查找

静态查找

若查找目的是为了查询某个特定的数据是否在表中或检索某个特定数据的各种属性,则此类查找表为静态查找表。

1、顺序查找

基本原理:从表一端开始逐个和关键字进行比较,若找到一个记录和给定值相等,则查找成功,反之失败。再简单点就是,一个一个的比大小,看看是否相等。

例子:

顺序查找更适合于顺序存储结构和链式存储结构的查找表。顺序查找需要一个个的去比较,效率很低。

2、折半查找(二分查找)

基本原理:1. 把序列分成左中右三部分,左部分小于中间值,右部分大于中间值;

2. 把给定值与中间值比较,确定下次查找是在左部分还是右部分;

3. 继续上面两步操作,直到成功或失败。

注意:折半查找需要注意给定的序列必须是一个有序序列。

例子:

3、分块查找

基本原理:顺序查找和二分法查找的折中,先分块,在块中顺序查找。

注意:分成的各块内部数据可能无序;各块之间有序(第二个块中的元素都比第一个块中元素都大);建立了索引表,索引表按关键字有序。

例子:

静态查找表方法的性能分析

对于动态查找的插入和删除不是特别好讲,我们就不在这里讲了,只是简单的介绍一下什么是二叉排序树和平衡二叉树,B_树只做了解。

动态查找

若再查找的过程中同时插入查找表中不存在的数据,或从查找表中删除已存在的某个数据,则称此类查找表为动态查找表。

1、二叉排序树

定义:1. 若它的左子树非空,则左子树上所有的结点的值均小于根结点的值;

2. 若它的右子树非空,则右子树上所有的结点的值均大于根结点的值;

3. 左右子树本身就是两棵二叉排序树。

例子:

定义看上去不是特别好理解,其实特别简单,我们再以例子简单的说一下。左子树的所有节点:3,1,6,4,7,都小于父节点8,右子树所有节点:10,14,13,都大于父节点。什么时候都是父节点大于左孩子,小于右孩子例如:8>3,8<10;3>1,3<6。

2、平衡二叉树

定义:1. 它或者是一棵空树

2. 树中任一结点的左右子树深度相差不超过1。

注意:从定义我们可得到:想要一颗树平衡,有三种情况,节点的平衡度要么为了0,要么为1,要么为-1。(平衡度:节点左子树的高度减去其右子树的高度。)

例子:

上面图在每个节点上标出了平衡度,所有的节点的平衡度的绝对值都小于等于0或1,所以它是一棵平衡二叉树。

时间: 2024-10-06 03:25:58

数据结构与算法(5)查找的相关文章

数据结构和算法————二分查找

  二分查找 这些天深刻的体会到了巩固知识的重要性.对数据结构和算法的学习有一年的时间,然后搁置了一年,最后发现都忘记了. 不过还好不是失忆,看了之前做过的笔记,还是能回想起来的. 现在想在写一遍,算是对本子上的笔记做一个备份,更重要的是加深我的印象. 首先说一下二分查找的思想:假设数据是按升序排序的,对于给定值val,从序列的中间位置开始比较. 如果当前位置值等于val,则查找成功: 若val小于当前位置值,则在数列的前半段中查找 若val大于当前位置值,则在数列的后半段中继续查找. 重复以上

数据结构与算法14—查找

查找 基本概念 查找就是在数据集中找出一个“特定元素”. 查找表是由同一类型的数据元素(或记录)构成的集合. 查找表是一种以集合为逻辑结构.以查找为核心的数据结构. 关键字 有时候我们需要指定某数据项的值来查找,这就用到了关键字. 关键字是数据元素中某个数据项的值,用以标识一个数据元素. 若此关键字可以识别唯一的一个记录,则称之谓“主关键字”:若此关键字能识别若干记录,则称之谓“次关键字”. 例: 对查找表经常进行的操作: 1)查询某个“特定的”数据元素是否在查找表中: 2)检索某个“特定的”数

数据结构和算法之 查找

线性表查找算法 顺序查找 折半查找(线性表必须是已经排序好的) 1 /**折半查找 2 * @param obj 3 * @param value 4 */ 5 public static void halfSort(int[] obj,int value){ 6 int len=obj.length;//获取数组的长度 7 int min=0; 8 int max=len-2; 9 while (min<=max) { 10 int middle=(min+max)/2;//获取数组中间元素的

数据结构与算法(c++)——查找二叉树与中序遍历

查找树ADT--查找二叉树 定义:对于树中的每个节点X,它的左子树中的所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项. 现在给出字段和方法定义(BinarySearchTree.h) #include <queue> class BinarySearchTree { private: struct Node { int value; Node* left; Node* right; }; Node* root; void insert(Node*, int); void trav

数据结构和算法--7查找算法

1.常用的查找算法 1) 顺序(线性)查找 2) 二分查找/折半查找 3) 插值查找 4) 斐波那契查找 2.查找 1)线性查找 A.题目: 有一个数列[1,43,22,-10,0],判断数列中是否包含此名称,如果找到了,就提示找到,并给出下标值. B,思路: 逐一查找 C.代码 package com.offcn.search; //线性查找 public class SeqSearch { public static void main(String[] args){ int[] arr =

数据结构与算法-链表查找倒数第K个值

查找链表中倒数第k个结点题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针.链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; int FindCoundDownInList(pListNode head,int num) { pListNode p1,p2; p1=p2=head; while(num-->0 && p1!=NULL) p1=p1->m_pNext; i

java 数据结构与算法 之查找法

一.二分查找法 二分查找就是将查找的键和子数组的中间键作比较,如果被查找的键小于中间键,就在左子数组继续查找:如果大于中间键,就在右子数组中查找,否则中间键就是要找的元素. @Test public void searchDuty(){ Integer[]t=new Integer[]{1,2,3,4,5,6};//原数组 Integer key=10;//目标元素 Integer start=0;//开始位置 Integer end=t.length-1;//结束位置 while(start<

[数据结构与算法] : 二分查找

1 #include <stdio.h> 2 3 #define NotFound -1; 4 typedef int ElementType; 5 6 int BinarySearch( const ElementType A[], ElementType X, int N ) 7 { 8 int Low, Mid, High; 9 10 Low = 0; High = N-1; 11 while( Low <= High ) // 注意终止条件 12 { 13 Mid = (Low

java数据结构和算法------折半查找

1 package iYou.neugle.search; 2 3 public class Binary_search { 4 public static int BinarySearch(double[] array, double key) { 5 int left = 0; 6 int right = array.length - 1; 7 while (left <= right) { 8 int mid = (left + right) / 2; 9 if (array[mid] =

java数据结构和算法------顺序查找

1 package iYou.neugle.search; 2 3 public class Sequence_search { 4 public static int SequenceSearch(double[] array, double key) { 5 for (int i = 0; i < array.length; i++) { 6 if (key == array[i]) { 7 return i; 8 } 9 } 10 return -1; 11 } 12 }