基本查找算法 

 

一、查找的基本概念

查找,也可称检索,是在大量的数据元素中找到某个特定的数据元素而进行的工作。查找是一种操作。

 

二、顺序查找

针对无序序列的一种最简单的查找方式。

时间复杂度为O(n)。

 

三、折半查找

针对已排序序列的一种查找方式。并且只适用于顺序存储结构的序列。要求序列中的元素基本不变,在需要做删除和插入操作的时候,会影响检索效率。

时间复杂度为O(logN)。

 

四、B树

B树又称二叉排序树(Binary Sort Tree)。

1、概念:

   它或者是一棵空树;或者是具有下列性质的二叉树:

  (1)若左子树不空,则左子树上所有结点的值均小于左子树所在树的根结点的值;

  (2)若右子树不空,则右子树上所有结点的值均大于右子树所在树的根结点的值;

  (3)左、右子树也分别为二叉排序树;

2、B树的查找:

时间复杂度与树的深度的有关。

  步骤:若根结点的关键字值等于查找的关键字,成功。

  否则:若小于根结点的关键字值,递归查左子树。

  若大于根结点的关键字值,递归查右子树。

  若子树为空,查找不成功。

3、B树的插入:

首先执行查找算法,找出被插结点的父亲结点。

  判断被插结点是其父亲结点的左儿子还是右儿子。将被插结点作为叶子结点插入。

  若二叉树为空。则首先单独生成根结点。

  注意:新插入的结点总是叶子结点,所以算法复杂度是O(h)。

4、B树的删除:

  如果删除的结点没有孩子,则删除后算法结束;

  如果删除的结点只有一个孩子,则删除后该孩子取代被删除结点的位置;

  如果删除的结点有两个孩子,则选择该结点的后继结点(该结点右孩子为根的树中的左子树中的值最小的点)作为新的根,同时在该后继结点开始,执行前两种删除算法,删除算法结束。

 

5、B+树

一棵m阶的B+树满足下列条件:

(1)每个结点最多m个孩子。

(2)除根结点和叶子结点外,其它每个结点至少有ém/2ù个孩子。

(3)根结点至少有两个孩子。

(4)所有的叶子结点在同一层,且包含了所有关键字信息。

(5)有k个孩子的分支结点包含k个关键字。

例如:

 

五、散列(hash)表

关键字:哈希函数、装填因子、冲突、同义词;

 

关键字和和存储的地址建立一个对应的关系:

Add = Hash(key);

 

解决冲突方法:

开放定址法 – 探测方式:线性探测、二次探测。

分离链接法 – 利用链表的方式。

 

查找找效率不依赖于数据长度n,查找效率非常快,很多能达到O(1),查找的效率是a(装填因子)的函数,而不是n的函数。因此不管n多大都可以找到一个合适的装填因子以便将平均查找长度限定在一个范围内。

 

一 定义

二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:

1. 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

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

3. 任意节点的左、右子树也分别为二叉查找树。

4. 没有键值相等的节点(no duplicate nodes)。

如下图,这个是普通的二叉树:

binary tree

在此基础上,加上节点之间的大小关系,就是二叉查找树:

binary search tree

二 实现

在实现中,我们需要定义一个内部类Node,它包含两个分别指向左右节点的Node,一个用于排序的Key,以及该节点包含的值Value,还有一个记录该节点及所有子节点个数的值Number。

public class BinarySearchTreeSymbolTable<TKey, TValue> : SymbolTables<TKey, TValue> where TKey : IComparable<TKey>, IEquatable<TValue>
{private Node root;private class Node{public Node Left { get; set; }public Node Right { get; set; }public int Number { get; set; }public TKey Key { get; set; }public TValue Value { get; set; }
    public Node(TKey key, TValue value, int number){this.Key = key;this.Value = value;this.Number = number;}
}