• 查找表


    基本概念:

    查找表:由同一类型的数据元素(或记录)构成的集合。

    关键字(键):用来表示数据元素的数据项成为关键字,简称键,其值称为键值

    主关键字:可唯一标识哥哥数据元素的关键字

    查找:根据给定的某个K值,再查找表寻找一个其键值等于K的数据元素。

    静态查找表:进行的是引用型运算

    动态查找表:进行的是加工型运算

    静态查找表:

    查找表用顺序表表示:(见P163
    const int maxsize=20 //静态查找表的表长
    typedef struct {
    TableElem elem[maxsize+1]/*一维数组, 0号单元留空*/
    int n/*最后一个元素的下标,也即表长*/
    }SqTable ;

    typedef struct {
    keytype key ; /*关键字域 */
    /*其它域*/
    } TableElem ;

    一、过程
    从表中最后一个记录开始顺序进行查找,若当前记录的
    关键字=给定值,则查找成功;否则,继续查上一记录
    若直至第一个记录尚未找到需要的记录,则查找失败

    二、算法
    方法一: 使用一种设计技巧:设立岗哨
    int SearchSqtable(Sqtable T, KeyType key
    { /*在顺序表R中顺序查找其关键字等于key的元素。
    若找到,则函数值为该元素在表中的位置,否则为0*/
    T.elem[0].key=key;
    i=T.n;
    while ( T.elem[i].key!=key ) i- - ;
    return i ;
    }

    三、算法分析
    成功查找: ASL=∑ni=1Pi Ci(设每个记录的查找概率相等)
    =1/n ∑ni=1n-i+1
    =n+1)/2
    不成功查找: ASL=n+1
    ▲顺序查找优点:简单,对表无要求;
    ▲顺序查找缺点:比较次数多


    1、二分查找思想:
    每次找中项
    .中项是,则找到;
    .否则,根据此中项的关键字与给
    定关键字的关系,决定在表的前
    或后半部继续找。
    关键点。可使下次查找范围缩小一半。
    二分查找基本思想: 每次将处于查找区间中间位置
    上的数据元素与给定值K比较,若不等则缩小查找区间并
    在新的区间内重复上述过程,直到查找成功或查找区间长
    度为0(查找不成功)为止

    二分查找算法:

    int SearchBin ( SqTable T, KeyType key ) {
    /*在有序表R中二分查找其关键字等于K的数据元素;若找到,
    则返回该元素在表中的位置, 否则返回0 */
    int low,high;
    low=1 ; high=T.n ;
    while ( low<=high )
    { mid=(low+high)/2 ;
    if (key==T.elem[mid].key) return mid;
    else if (keyT.elem[mid].key ) high =mid-1 ;
    else low=mid+1 ;
    }
    return (0) ;
    }
    分块查找

    一、查找过程:
    1.先建立最大(或小)关键字表——索引表(有序)
    即将每块中最大(或最小)关键字及指示块首记
    录在表中位置的指针依次存入一张表中,此表称为索
    引表;
    2.查找索引表,以确定所查元素所在块号;
    将查找关键字k与索引表中每一元素(即各块中最
    大关键字)进行比较,以确定所查元素所在块号;
    3.在相应块中按顺序查找关键字为k的记录

    算法分析:

    静态查找表的上述三种不同实现各有优缺点。其中,
    顺序查找效率最低但限制最少。
    二分查找效率最高,但限制最强。
    而分块查找则介于上述二者之间。在实际应用中应根据需要加以选择。

    算法分析:

    静态查找表的上述三种不同实现各有优缺点。其中:

    顺序查找效率低但限制最少

    二分查找效率最高,但限制最强

    而分块查找则介于上述两者之间,再实际应用中应根据需要加以选择。

    一、二叉排序树
    ●什么是二叉排序树?
    一棵二叉排序树(Binary Sort Tree)(又称二叉查找树)或者是一棵空二叉树,或者
    是具有下列性质的二叉树:
    ① 若它的左子树不空,则左子树上所有结点的键值均小于它的根结点键值;
    ② 若它的右子树不空,则右子树上所有结点的键值均大于它的根结点键值;
    ③ 根的左、右子树也分别为二叉排序树。
    ●性质:
    中序遍历一棵二叉排序树所得的结点访问序列是键值的递增序列。

    二、二叉排序树上的查找:
    1、过程:
    当二叉排序树不空时,首先将给定值和根结点的关键字
    比较,若相等,则查找成功;否则根据给定值与根结点关键字
    间的大小关系,分别在左子树或右子树上继续进行查找。

    (1)二叉排序树,对每个结点,均有:
    左子树上的所有结点键值都比根的小;
    右子树上的所有结点键值都比根的大。
    (2)构造二叉排序树的同时也对序列排序了。

    BinTree SearchBST(BinTree bst ,KeyType key)
    /*在根指针bst所指的二叉排序树上递归地查找键值等于key的结点。若成功,则返回指
    向该结点的指针,否则返回空指针*/

    { if (bst==NULL) return NULL; //不成功时返回 NULL 作为标记
    else if (key==bst->key) return bst; //成功时返回结点地址


    else if ( key<bst->key)
    return SearchBST (bst->lchild, key); //继续在左子树中查找
    else
    return SearchBST (bst->rchild, key); //继续在右子树中查找
    }
    由上面的查找过程可知:在二叉排序树上进行查找, 若查找成功,则是从根结点出发走
    了一条从根结点到待查结点的路径;若查找不成功,则是从根结点出发走了一条从根到
    某个叶子的路径。因此与二分查找类似,关键字比较的次数不超过二叉树的深度

    二叉排序树的插入和生成
    对序列R={k1k2kn}k1kn均为关键字值,则
    按下列原则可构造二叉排序树:
    (1)k1为根;
    (2)k1k2 ,则令k2k1的右孩,否则为左孩;
    (3) k3k4kn递归重复(2

     ◆散列函数哈希函数——设记录表A,长为nai
    1≤i≤n)为表中某一元素, ki为其关键字,则关键
    ki和元素ai在表中的地址之间有一函数关系,即:
    Addrai= Hki

    ◆散列地址——由散列函数决定数据元素的存储位置,该位置
    称为散列地址。

    冲突:

    k1≠ k2 但 H(k1) =H(k2)的现象称为冲突
    即:不同的关键字映射到同一存储单元。
    并称k1和k2同义词


    常用散列

    1、数字分析法

    2、除留余数法

    3.平方取中法

    4.基数转换法

  • 相关阅读:
    关于API微服务网关
    适用于企业的API管理平台
    简单的api测试
    Json,2020年api数据格式的Top 1
    API文档之团队协作
    如何进行API测试以提高程序质量
    API接口也要监控?
    春招实习_腾讯 wxg 一面 3.27 15:00
    春招实习_腾讯一面 & 二面_3.13
    春招实习_阿里一面
  • 原文地址:https://www.cnblogs.com/X404/p/12230838.html
Copyright © 2020-2023  润新知