zoukankan      html  css  js  c++  java
  • 查找关键字算法:静态查找表(Static Search Table)

    在本篇文章中,我们要主介绍查找关键字的内容,自我感觉有个不错的建议和大家分享下

        查找表(Search table)是由统一类型的据数元素(或记载)成构的集合。关键字(key)是据数元素中某个据数项的值,又称为键值,用它可以示表一个据数元素,也可以标识一个记载的据数项(字段),称之为关键码。若此关键字可以独一地标识一个记载,则称此关键字为主关键字(primary key)。而对于那些可以识别多个据数元素(或记载)的关键字,称为次关键字(Secondary Key),次关键字也可以理解为不以独一标识一个据数元素(或记载)的关键字,它对应的据数项就是次关键码。

        查找(Searching)就是根据给定的某个值,在查找表中定确一个其关键字即是给定值的据数元素(或记载)。

        查找表按照作操方法来分有两大种:静态查找表和动态查找表。

        静态查找表(Static Search Table) :只作查找作操的查找表,要主作操为:

        (1)询查某个“特定的”据数元素否是在查找表中。

        (2)检索某个“特定的”据数元素和各种性属。

        动态查找表(Dynamic Search Table):在查找进程中同时插入查找表中不存在的据数元素,或者从查找表中除删已存在的某个据数元素。

        (1)查找时插入据数元素。

        (2)查找时除删据数元素。

        

        本文先来说说静态查找表。

        一、序顺表查找

        序顺查找(Sequential Search)又叫线性查找,是最基本的查找技巧,它的查找进程是:从表中的一个(或最后一个)记载开始,逐一行进记载的关键字和给定值较比,若某个记载的关键字和给定值相称,则查找胜利,找到所查的记载;如果直到最后一个(或第一个)记载,其关键字和给定值都较比不相称时,则表中没有所查的记载,查找不胜利。

        二、有序表查找

        1、折半查找

        折半查找(Binary Search)技巧,又称为二分查找。它的前提是线性表中的记载必须是关键码有序(平日从小到大有序),线性表必须用采序顺存储。折半查找的基本思想是:在有序表中,取间中记载作为较比象对,若给定值与间中记载的关键字相称,则查找胜利;若给定值小于间中记载的关键字,则在间中记载的左半区续继查找;若给定值大于间中记载的关键字,则在间中记载的右半区续继查找。断不重复上述进程,直到查找胜利,或全部查找区域无记载,查找失败为止。

        2、值插查找

        值插查找(Interpolation Search)是根据要查找的关键字key与查找表中最大小最记载的关键字较比后的查找法方,其核心就在于值插的计算公式 (key-a[low])/(a[high]-a[low]) 。

        3、斐波那契查找

        斐波那契查找(Fibonacci Search)算法的核心在于

        1)当key = a[mid] 时,查找就胜利;

        2)当key < a[mid] 时,新围范是第low 个到第mid - 1个,此时围范个数为F[k-1]-1个。

        3)当key > a[mid] 时,新围范是第m+1 个到第high个,此时围范个数为F[k-2]-1个。

        如图8-4-13所示。

        查找和关键字

        示例码代如下:(改编自《话大据数结构》)

        

        每日一道理
    一个安静的夜晚,我独自一人,有些空虚,有些凄凉。坐在星空下,抬头仰望美丽天空,感觉真实却由虚幻,闪闪烁烁,似乎看来还有些跳动。美的一切总在瞬间,如同“海市蜃楼”般,也只是刹那间的一闪而过,当天空变得明亮,而这星星也早已一同退去……

        

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
     
    #include<iostream>
    using  namespace std;

    #define INFINITLY  65535
    #define MAXSIZE  100

    int F[ 100];  /* 斐波那契数列 */

    /* 无兵哨序顺查找,arr为组数,n为要查找的组数个数,key为要查找的关键字 */
    /* 返回元素的位置pos (下标+1)*/
    int Sequential_Search( int *arr,  int n,  int key)
    {
         for ( int i =  0; i < n; i++)
             if (arr[i] == key)
                 return i +  1;
         return INFINITLY;  //返回无限说明失败
    }

    /* 有兵哨序顺查找 */
    /* 返回元素的位置pos (下标+1)*/
    int Sequential_Search2( int *arr,  int n,  int key)
    {
        arr[n] = key;
         int i =  0;
         while (arr[i] != key)
            i++;
         return i +  1//返回n+1 则说明失败
    }
    /* 折半查找 */
    /* 返回元素的下标 */
    int Binary_Search( int *arr,  int n,  int key)
    {
         int low =  0; /* 定义最低下标为记载首位 */
         int high = n -  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; /* 若相称则说明mid即为查找到的位置 */
        }
         return INFINITLY;
    }
    /* 值插查找 */
    int Interpolation_Search( int *arr,  int n,  int key)
    {
         int low =  0;
         int high = n -  1;
         int mid;
         while (low <= high)
        {
             /* 值插公式 */
            mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]);
             if (key < arr[mid])
                high = mid -  1;
             else  if (key > arr[mid])
                low = mid +  1;
             else
                 return mid;
        }
         return INFINITLY;
    }

    /* 斐波那契查找 */
    int Fibonacci_Search( int *arr,  int n,  int key)
    {
         int low =  0; /* 定义最低下标为记载首位 */
         int high = n -  1; /* 定义最高下标为记载末位 */
         int i, k =  0;
         int mid;

         while (n > F[k] -  1)
            k++;
         for (i = n -  1; i < F[k] -  1; i++)
            arr[i] = arr[n -  1];

         while (low <= high)
        {
            mid = low + F[k -  1] -  1;
             if (key < arr[mid])
            {
                high = mid -  1;
                k = k -  1;
            }
             else  if (key > arr[mid])
            {
                low = mid +  1;
                k = k -  2;
            }
             else
            {
                 if (mid <= n -  1)
                     return mid;
                 else
                     return INFINITLY;
            }
        }

         return INFINITLY;
    }

    int main( void)
    {
         int arr[MAXSIZE] = { 1162435475962738899};
         int result = Sequential_Search(arr,  1024);
         if (result != INFINITLY)
            cout <<  "24 's pos : " << result << endl;

        result = Sequential_Search2(arr,  1059);
         if (result !=  sizeof(arr) /  sizeof(arr[ 0]))
            cout <<  "59 's pos : " << result << endl;

        result = Binary_Search(arr,  1073);
         if (result != INFINITLY)
            cout <<  "73 's pos : " << result +  1 << endl;

        result = Interpolation_Search(arr,  1016);
         if (result != INFINITLY)
            cout <<  "16 's pos : " << result +  1 << endl;

        F[ 0] =  0;
        F[ 1] =  1;
         for( int i =  2; i <  100; i++)
        {
            F[i] = F[i -  1] + F[i -  2];
        }

        result = Fibonacci_Search(arr,  1088);
         if (result != INFINITLY)
            cout <<  "88 's pos : " << result +  1 << endl;

         return  0;
    }

        输出为:

        查找和关键字

        

        

    文章结束给大家分享下程序员的一些笑话语录: AdobeFlash拖垮Windows拖垮IE!又拖垮Linux拖垮Ubuntu拖垮FirxEox!还拖垮BSD拖垮MacOS拖垮Safri!简直无所不拖!AdobeFlash滚出网路世界!不要以为市占有率高就可以持续出烂货产品!以后替代品多得是!

  • 相关阅读:
    shell预备知识
    php session和cookie
    php数据库访问抽象层PDO
    递归求斐波那契数
    SqlDataReader的使用
    DataAdapter与DataSet的使用
    CLR
    Android Studio javadoc 生成注释文档
    MySQL教程之concat以及group_concat的用法
    一文读懂MQTT协议
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3060091.html
Copyright © 2011-2022 走看看