查找算法學習

####查找算法學習算法

#####順序查找數組

  • 最簡單的查找方法,從線性表的一端開始,依次將每一個記錄的關鍵字進行比較,若相同則返回該關鍵字所在數組的位置
int SeqSearch(int A[],int n,int key){
    int i ;
    for(i = 0;i<n;i++){

        if(A[i] == key){
            return i;   
            //返回當前位置
        }

    }

    return  -1;
}

int main(int argc, const char * argv[]) {

    int A[10] = {1,2,3,4,5,6,7,8,9,0};
    int data = SeqSearch(A,10, 0);
    printf("%d",data);
    return 0;
}

#####折半查找(二分查找)函數

折半查找要求查找表的數據是線性結構保存,而且還要求查找表的數據是按照關鍵字由小到大有序排列學習

int BinarySearch(int A[],int n,int key){

    int low,high,mid;
    low = 0;high = n-1;
    while(low<=high){

        mid = (low+high)/2;
        if(A[mid]==key){   
         //若是中間的值剛好等於關鍵字的值,則返回
            return mid;
        }else if(A[mid]>key)  
        //若是中間值大於關鍵字
            high = mid -1;     
             //最大的值爲中間值 -1
            else
            low = mid +1;      
             // 最小的值爲中間值
        }
    return  -1;
}

int main(int argc, const char * argv[]) {
    int A[10] = {1,2,3,4,5,6,7,8,9,0};
    int data = BinarySearch(A, 10, 3);
    printf("%d",data);

}

#####索引查找指針

  • 在大批量的數據進行查找時,查找效率不高.爲了提升查找效率,可首先對大批量的數據針對關鍵字建立一個索引.
  • 索引的特色:提升數據查找的速度,缺點是須要佔用必定的磁盤空間,另外索引減慢了數據插入和刪除的速度
#define TABLE_LEN 30        //主表長度
#define INDEXTABLE_LEN 3    //索引表長度
typedef  struct item{
    int index;          //索引值
    int start;          //開始位置
    int length;         //子表長度
}INDEXITEM;
/*定義主表數據*/
long stu[TABLE_LEN] = {
1080101,1080102,1080103,1080104,1080105,1080106,0,0,0,0,
1080201,1080202,1080203,1080204,0,0,0,0,0,0,
1080301,1080302,1080303,1080304,0,0,0,0,0,0
};
/* 定義索引表*/
INDEXITEM indextable[INDEXTABLE_LEN] = {
    {10801,0,6},
    {10802,10,4},
    {10803,20,4}
};
/*  查找*/
int IndexSearch(int key){
    int i,index1,start,length;
    index1 = key/100;
    for(i = 0;i<INDEXTABLE_LEN;i++){
        if(indextable[i].index==index1){   
         //若是在索引表中找到了
            start  = indextable[i].start;  
             //得到數據初始長度
            length = indextable[i].length; 
             //得到該索引數據結束長度
            break;
        }
    }
    if(i>=INDEXTABLE_LEN){
        return -1;
    }
    for(i = start;i<start+length;i++){ 
     //在該索引範圍查找key 值
        if(stu[i] == key){
            return i ;
        }
    }

    return - 1;
}

/*插入索引*/

int InsertNode(key){
    int i,index1,start,length;
    index1 = key/100;
    for(i = 0;i<INDEXTABLE_LEN;i++){
        if(indextable[i].index==index1){ 
           //若是在索引表中找到了
            start  = indextable[i].start;  
             //得到數據初始長度
            length = indextable[i].length;  
            //得到該索引數據結束長度
            break;
        }
    }

    if(i>=INDEXTABLE_LEN) return -1;
    stu[start+length] = key;
    indextable[i].length++;
    return 0 ;

}

int main(int argc, const char * argv[]) {
    // insert code here...
    int key = 1080202;
    int pos = IndexSearch(key);
    printf("%d",pos);
    return 0;
}

#####散列表 method:以線性表每一個元素的關鍵字key爲自變量,經過必定的函數關係h(key)計算出函數的值code

  • 構造散列表函數
  • 1,直接定址法:以關鍵字key自己或關鍵字key加上某個常數C,用來做爲散列地址
  • 2,除數取餘法:用關鍵字key除以散列表長度n,獲得的餘數做爲散列地址(最好將其值取一個素數)
  • 3,數字分析法:取關鍵字中某些比較分散的數字做爲散列地址的方法.適用於關鍵字已知
  • 4,平方取中法:將關鍵字key求平方後,取中間的幾位數字做爲散列地址的方法

處理衝突索引

  • 開放地址法:從發生衝突的那個數組元素開始,按必定的次序,從散列表中查出一個空閒的元素數組,把發生衝突的待插入元素存入該數組元素中
  • 連接法:在散列表的每一個存儲單元增設一個指針域,將散列地址相同的元素連接起來
#define HASH_LEN 13
#define TABLE_LEN 8
int data[TABLE_LEN] = {69,65,90,37,92,6,28,54};
//原始數據
int hash[HASH_LEN] = {0};
//散列表 初始化爲0
void InsertHash(int hash[],int m,int data){
    //參數hash爲散列表的首地址,參數M爲散列表長度,參數data爲須要添加到散列表的關鍵字
    int i;
    i = data % 13;
    while(hash[i])
        //若已經被使用,則使用線性探測法查找下一個開放地址
        i = (++i) % m;
    hash[i] = data;
}
/*  建立散列表*/
void CreateHash(int hash[],int m,int data[],int n){
    int i ;
    for(i = 0;i<n;i++){
        InsertHash(hash, m, data[i]);
    }
}
/*進行hash 搜索*/
int HashSearch(int hash[],int m,int key){
    int i;
    i = key % 13;
    while(hash[i]&&hash[i]!=key)
        i = (++i) % m ;
    if(hash[i]==0){
        return -1;
    }else
        return i;

}
int main(int argc, const char * argv[]) {
    // insert code here...

    CreateHash(hash, HASH_LEN, data, TABLE_LEN);
    for(int i = 0;i<HASH_LEN;i++){
        printf("%d ",hash[i]);
    }
    int  pos = HashSearch(hash, HASH_LEN, 54);
    printf("%d",pos);
    printf("Hello, World!\n");
    return 0;
}
相關文章
相關標籤/搜索