查找的四種算法比較

順序查找垛吗、二分查找残腌、二叉搜索樹、Hash表

1. 順序查找

設(shè)想有一個1M的數(shù)據(jù)鸠删,我們?nèi)绾卧诶锩嬲业轿覀兿胍哪莻€數(shù)據(jù)抱完。此時數(shù)據(jù)本身沒有特征,所以我們需要的那個數(shù)據(jù)可能出現(xiàn)在數(shù)組的各個位置刃泡,可能在數(shù)據(jù)的開頭位置巧娱,也可能在數(shù)據(jù)的結(jié)束位置。這種性質(zhì)要求我們必須對數(shù)據(jù)進(jìn)行遍歷之后才能獲取到對應(yīng)的數(shù)據(jù)烘贴。

int find(int array[], int len, int val)
{
    if(array == NULL && length == 0)    return -1;
    for(int i=0;i<len;i++){
        if(val == array[i])
            return i;
    }
    return -1;
}

分析:由于我們不清楚這個數(shù)據(jù)判斷究竟需要多少次禁添。但是,我們知道桨踪,這樣一個數(shù)據(jù)查找最少需要1次老翘,那么最多需要n次,平均下來可以看成是(1+n)/2锻离,差不多是n的一半铺峭。我們把這種比較次數(shù)和n成正比的算法復(fù)雜度記為o(n)。


2. 二分查找

如果數(shù)據(jù)排列地非常整齊汽纠,那結(jié)果會是什么樣的呢卫键?就像在生活中,如果平時不注意收拾整齊疏虫,那么找東西的時候非常麻煩永罚,效率很低啤呼;但是一旦東西放的位置固定下來卧秘,所有東西都?xì)w類放好,那么結(jié)果就不一樣了官扣,我們就會形成思維定勢翅敌,這樣查找東西的效率就會非常高。那么惕蹄,對一個有序的數(shù)組蚯涮,我們應(yīng)該怎么查找呢?二分法就是最好的方法卖陵。

int BinaryFind(int array[], int len, int val)
{
    if(array == NULL && length == 0)    return -1;
    int start = 0, end = len-1, middle=0;
    while(start<=end){
        middle = (start + end)/2;
        if(val == array[middle])    return middle;
        else if(val > array[middle])    start = middle+1;
        else end = middle-1;
    }
    return -1;
}

分析:上面我們說到普通的數(shù)據(jù)查找算法復(fù)雜度是o(n)遭顶。那么我們可以用上面一樣的方法判斷一下算法復(fù)雜度。這種方法最少是1次泪蔫,那么最多需要多少次呢棒旗?我們發(fā)現(xiàn)最多需要log(n+1)/log(2)即可。


3. 二叉搜索樹

二叉搜索樹是二分查找的二叉樹實現(xiàn)撩荣,二叉搜索樹每個結(jié)點都有作為搜索依據(jù)的關(guān)鍵碼铣揉,饶深,所有結(jié)點的管家嗎互不相同;左子樹(若存在)上的所有結(jié)點的關(guān)鍵碼都小于根結(jié)點的關(guān)鍵碼逛拱;右子樹(若存在)上的所有結(jié)點的關(guān)鍵碼都大于根結(jié)點的關(guān)鍵碼敌厘;左子樹和右子樹也是二叉搜索樹。

typedef struct _NODE
{
    int data;
    struct _NODE* left;
    struct _NODE* right;
}NODE;

const NODE* find_data(const NODE* pNode, int data){
    if(NULL == pNode)
        return NULL;

    if(data == pNode->data)
        return pNode;
    else if(data < pNode->data)
        return find_data(pNode->left, data);
    else
        return find_data(pNode->right, data);       
}

4. Hash表

typedef struct _LINK_NODE
{
    int data;
    struct _LINK_NODE* next;
}LINK_NODE;

LINK_NODE* hash_find(LINK_NODE* array[], int mod, int data)
{
    int index = data % mod;
    if(NULL == array[index])
        return NULL;

    LINK_NODE* pLinkNode = array[index];
    while(pLinkNode){
        if(data == pLinkNode->data)
            return pLinkNode;
        pLinkNode = pLinkNode->next;
    }

    return pLinkNode;
}

分析:hash表因為不需要排序朽合,只進(jìn)行簡單的歸類俱两,在數(shù)據(jù)查找的時候特別方便。查找時間的大小取決于mod的大小曹步。mod越小锋华,那么hash查找就越接近于普通查找;那么hash越大呢箭窜,那么hash一次查找成功的概率就大大增加毯焕。

一步一步寫算法(之查找)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市磺樱,隨后出現(xiàn)的幾起案子纳猫,更是在濱河造成了極大的恐慌,老刑警劉巖竹捉,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芜辕,死亡現(xiàn)場離奇詭異,居然都是意外死亡块差,警方通過查閱死者的電腦和手機(jī)侵续,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憨闰,“玉大人状蜗,你說我怎么就攤上這事○亩” “怎么了轧坎?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泽示。 經(jīng)常有香客問我缸血,道長,這世上最難降的妖魔是什么械筛? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任捎泻,我火速辦了婚禮,結(jié)果婚禮上埋哟,老公的妹妹穿的比我還像新娘笆豁。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布渔呵。 她就那樣靜靜地躺著怒竿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪扩氢。 梳的紋絲不亂的頭發(fā)上耕驰,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音录豺,去河邊找鬼朦肘。 笑死,一個胖子當(dāng)著我的面吹牛双饥,可吹牛的內(nèi)容都是我干的媒抠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼咏花,長吁一口氣:“原來是場噩夢啊……” “哼趴生!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起昏翰,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤苍匆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后棚菊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浸踩,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年统求,在試婚紗的時候發(fā)現(xiàn)自己被綠了检碗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡码邻,死狀恐怖折剃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冒滩,我是刑警寧澤微驶,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布浪谴,位于F島的核電站开睡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏苟耻。R本人自食惡果不足惜篇恒,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凶杖。 院中可真熱鬧胁艰,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至解虱,卻和暖如春攘须,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殴泰。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工于宙, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悍汛。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓捞魁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親离咐。 傳聞我的和親對象是個殘疾皇子谱俭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容