• 查找


    一、基于线性表的查找

    1、顺序查找:对关键字没有排序的线性表来说,用所给的关键字与线性表中的所有记录逐个进行比较,直到成功或是失败。

    int seqlistsearch(seqlist L, int k){
        int len = L.len;
        if (len <= 0){
            cout << "没有该元素,无法查找!" << endl;
        }
        else{
            while (len > 0 && L.Arry[len].key != k){
                len--;
            }
            return len;
        }
    }

    显然上述算法的时间消耗主要是while,if判断处。有实验表明,当查询记录超过1000条的时候,i>0这条语句的消费时间是整个算法的60%,所以我们将之改进。

    int seqlistsearch2(seqlist L, int k){
        L.Arry[0].key = k;//设置监视哨
        int i = L.len;
        while (L.Arry[i].key!=k)
        {
            i--;
        }
        return i;
    }

    这样以来,从后往前查找时候,省去了边界的判断,无论查找失败与否都能找到该条记录在查找表中的位置,如果i>0表明查找成功,i=0查找失败。

    2、折半查找:(1)若果k=key,查找成功(2)若果k<key,查找元素在关键字key的前面(3)若果k>key,查找元素在关键字key的后面

    int zbcz(seqlist* L,int k){
     int low = 1;
     int  high = L->len,mid;
     while (low < high){
      mid = (high+ low) / 2;
      if (k==L->Arry[mid].key)return mid;
      else if (L->Arry[mid].key < k)low = mid + 1;
      else high = mid - 1;
     }
     return 0;
    }

    折半查找是典型的分治类算法,所以算法也可以使用递归来实现。

    int zbcz2(seqlist* L,int low,int high, int k){
        if (low < high){
            int mid = (high + low) / 2;
            if (L->Arry[mid].key == k){
                return mid;
            }
            else if (L->Arry[mid].key < k){
                return zbcz2(L, mid + 1, L->len, k);
            }
            else{
                return zbcz2(L, low, mid-1, k);
            }
        }
    }

    3、索引查找:

    如果线性查找希望有较快的查找苏都,有需要动态的变化,可以使用索引查找。

    索引查找分为3种:

    1、稠密、稀疏索引,两者概念大体相同,只不过稠密索引是每个搜索码都对应一个索引值,稀疏一个搜索码可能对应多个索引值

    2、分块索引,把数组分块,索引中记录每个块中最大的值,并把索引按max排序,块内部可无序

    3、倒排索引,我代码中没有实现这个,因为这个太简单了,只需要分割文本中关键字,把关键字作为索引,数组中对应的index作为值,插到一个字符串中即可‘

      1 #include<iostream>  
      2 #define INFINITY 65535  
      3 using namespace std;  
      4   
      5 struct Object{  
      6     void* value;  
      7     int key;      
      8 };  
      9 struct Index{  
     10     int i;  
     11   
     12       
     13     //block index  
     14     int max;  
     15     int length;  
     16     void* value[5];  
     17       
     18     //dense index  
     19     //int key;  
     20     //void* value;  
     21 };  
     22   
     23 int main(){  
     24       
     25     Object _obj[5];  
     26     Index _index[5];  
     27       
     28     //b1  
     29     _obj[0].key=12;  
     30     _obj[0].value=(void*)"i'm 12";  
     31       
     32     //b2  
     33     _obj[1].key=107;  
     34     _obj[1].value=(void*)"i'm 107";  
     35       
     36     _obj[2].key=36;  
     37     _obj[2].value=(void*)"i'm 36";  
     38       
     39     //b3  
     40     _obj[3].key=18;  
     41     _obj[3].value=(void*)"i'm 18";  
     42       
     43     _obj[4].key=72;  
     44     _obj[4].value=(void*)"i'm 72";  
     45       
     46     //block index  
     47     for(int i=0;i<5;i++){  
     48         _index[i].max=INFINITY;  
     49     }  
     50       
     51     _index[0].max=12;  
     52     _index[0].length=1;  
     53     _index[0].value[0]=&_obj[0];  
     54       
     55       
     56     _index[1].max=107;  
     57     _index[1].length=2;  
     58     _index[1].value[0]=&_obj[1];  
     59     _index[1].value[1]=&_obj[2];  
     60       
     61       
     62     _index[2].max=72;  
     63     _index[2].length=2;  
     64     _index[2].value[0]=&_obj[3];  
     65     _index[2].value[1]=&_obj[4];  
     66       
     67     for(int i=0;i<3;i++){  
     68         for(int j=1;j>=0;j--){  
     69             if(_index[j].max>_index[j+1].max){  
     70                 swap(_index[j],_index[j+1]);  
     71             }  
     72         }  
     73     }  
     74       
     75     for(int i=0;i<5;i++){  
     76         _index[i].i=i;  
     77     }  
     78       
     79     for(int i=0;i<5;i++){  
     80         cout<<_index[i].i<<' ';  
     81     }  
     82     cout<<endl;  
     83       
     84     for(int i=0;i<5;i++){  
     85         cout<<_index[i].max<<' ';  
     86     }  
     87     cout<<endl;  
     88       
     89     for(int i=0;i<5;i++){  
     90         if(_index[i].max<INFINITY){  
     91             for(int j=0;j<_index[i].length;j++){  
     92                 cout<<(char*)((Object*)_index[i].value[j])->value<<' ';  
     93             }  
     94         }  
     95     }  
     96     cout<<endl;  
     97   
     98 //dense index  
     99     /* 
    100 for(int i=0;i<5;i++){ 
    101         _index[i].key=_obj[i].key; 
    102         _index[i].value=&_obj[i]; 
    103     } 
    104     for(int i=0;i<5;i++){ 
    105         for(int j=3;j>=0;j--){ 
    106             if(_index[j].key>_index[j+1].key){ 
    107                 swap(_index[j],_index[j+1]); 
    108             } 
    109         } 
    110     } 
    111     for(int i=0;i<5;i++){ 
    112         _index[i].i=i; 
    113     } 
    114      
    115      
    116     for(int i=0;i<5;i++){ 
    117         cout<<_index[i].i<<' '; 
    118     } 
    119     cout<<endl; 
    120     for(int i=0;i<5;i++){ 
    121         cout<<_index[i].key<<' '; 
    122     } 
    123     cout<<endl; 
    124     for(int i=0;i<5;i++){ 
    125         cout<<(char*)((Object*)_index[i].value)->value<<' '; 
    126     } 
    127     cout<<endl;*/  
    128       
    129     return 0;  
    130 }  
    索引查找
  • 相关阅读:
    自定义指令directive
    angular中的表单验证
    ng-init,ng-controller,ng-model
    Redis执行lua脚本,key不存在的返回值
    消息队列对比
    数据库设计范式
    网络IO模型
    .NET 线程、线程池
    异步和多线程
    Memcache知识点
  • 原文地址:https://www.cnblogs.com/yjds/p/8645415.html
Copyright © 2020-2023  润新知