查找

查找表

同一類型的數(shù)據(jù)元素(或記錄)的集合。

關(guān)鍵字

數(shù)據(jù)元素(或記錄)中某個(gè)數(shù)據(jù)項(xiàng)的值,用它可以標(biāo)識(shí)(識(shí)別)一個(gè)數(shù)據(jù)元素(或記錄)。若此關(guān)鍵字可以唯一地標(biāo)識(shí)一個(gè)記錄,則稱此關(guān)鍵字為主關(guān)鍵字(Primary key)。用以識(shí)別若干記錄的關(guān)鍵字,是次關(guān)鍵字(Secondary Key)。

查找

查找(Searching)是根據(jù)給定的某個(gè)值,在查找表中確定一個(gè)其關(guān)鍵字等于給定值的數(shù)據(jù)元素(或記錄)。
若查找到了數(shù)據(jù)元素,則查找成功;否則,查找失敗。

查找分類:
1、靜態(tài)查找和動(dòng)態(tài)查找
靜態(tài)查找:特定元素是否存在;查找特定元素的屬性。
動(dòng)態(tài)查找:插入數(shù)據(jù)元素;刪除數(shù)據(jù)元素。

2、有序查找和無序查找

靜態(tài)查找表各種表示方法:以順序表或線性鏈表表示靜態(tài)查找表

順序表的順序查找例子:

    private static int arrays [] = {12,15,3,56,234,13,76,45,23};

    public static void main(String[] args) {
        System.out.println(findInt(45));
    }

    private static int findInt(int key){
        for(int i = 1; i <= arrays.length ; i++){
            if(arrays[i] == key){
                return arrays[i] ;
            }
        }
        return 0;
    }

那么簡單的數(shù)據(jù)查找可以這樣做,如果是非常龐大的數(shù)據(jù)需要查找某個(gè)關(guān)鍵字的話,又怎么做呢?有沒有一個(gè)標(biāo)準(zhǔn)去衡量查找的優(yōu)劣呢?

我們需要知道如下幾個(gè)定義:
1、查找操作的性能分析:時(shí)間復(fù)雜度、空間復(fù)雜度、算法的其他性能。
2、衡量查找算法好壞的依據(jù):其關(guān)鍵字和給定值進(jìn)行過比較的記錄個(gè)數(shù)的平均值”
3、平均查找長度:為確定記錄在查找表中的位置,需和給定值進(jìn)行比較的關(guān)鍵字個(gè)數(shù)的期望值。

有序表的查找

折半查找、斐波那契查找、插值查找。

折半查找

    //折半查找算法
    public static int Binary_Search(int arr[], int n, int key) {
        int mid;
        int low = 1;//最低元素索引
        int high = n;//最高元素索引
        int flag = 0;//哨兵用來記錄查找次數(shù)
        while (low <= high) {
            mid = (low + high) / 2;
            if (key < arr[mid]) {
                high = mid - 1;
                flag++;
            } else if (key > arr[mid]) {
                low = mid + 1;
                flag++;
            } else
                return mid;
        }
        return 0;
    }

折半查找性能分析
折半查找查找過程也可用二叉樹描述

折半查找的效率比順序查找高,但折半查找只能適用于有序表,且限于順序存儲(chǔ)結(jié)構(gòu)(對(duì)線性鏈表無法進(jìn)行折半查找)。

插值查找:在折半查找的基礎(chǔ)上改進(jìn)。
在取值范圍1 ~ 10000 之間 100 個(gè)元素從小到大均勻分布的數(shù)組中查找5, 我們自然會(huì)考慮從數(shù)組下標(biāo)較小的開始查找。那么就不一定是折半了,有可能折一小部分,有可能折更多。

   public static int chazhiSearch(int arr[], int n, int key) {
        int low, high, mid;
        low = 1;//最低元素索引
        high = n;//最高元素索引
        while (low <= high) {
            //關(guān)鍵算法,效率提高不少
            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 0;
    }

可見,關(guān)鍵字分布比較均勻的情況下,比折半查找更快,

斐波那契查找:
斐波那契查找的平均性能比折半查找的好,但最壞的情況比它差。還有一個(gè)優(yōu)點(diǎn),分割時(shí),只需進(jìn)行加、減運(yùn)算。

    public static int fibonacciSearch(int arr[], int n, int key) {
        //構(gòu)造一個(gè)斐波拉切數(shù)列
        int F[] = new int[20];
        F[0] = 0;
        F[1] = 1;
        for (int j = 2; j < F.length; j++) {
            F[j] = F[j - 1] + F[j - 2];//遞歸構(gòu)造斐波拉契數(shù)列
        }

        int mid;
        int i;
        int low = 1;
        int high = n;
        int k = 0;
        while (n > F[k] - 1) {
            k++;
        }
        for (i = n; i < F[k] - 1; i++) {
            arr[i] = arr[n];//必須擴(kuò)展對(duì)象數(shù)組的后面幾位元素,否則容易越界
        }
        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) {
                    return mid;
                } else {
                    return n;
                }
            }
        }
        return 0;
    }

訪問頻度域?
以上的查找都是等概率的查找,那不同概率的查找是怎么樣的呢? 這就要用到 靜態(tài)樹表的查找
帶權(quán)路徑長度和最短的為靜態(tài)最優(yōu)查找樹。
索引順序表的查找(分塊查找)
哈希查找?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,967評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,273評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,870評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,742評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,527評(píng)論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,010評(píng)論 1 322
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,108評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,250評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,769評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,656評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,853評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,371評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,103評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,472評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,717評(píng)論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,487評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,815評(píng)論 2 372

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

  • 一、相關(guān)定義 查找——查找就是根據(jù)給定的某個(gè)值,在查找表中確定一個(gè)其關(guān)鍵字等于給定值的數(shù)據(jù)元素(或記錄)。所有這些...
    開心糖果的夏天閱讀 1,149評(píng)論 0 8
  • 原文出處:http://www.cnblogs.com/maybe2030/p/4715035.html引文出處:...
    明教de教主閱讀 9,210評(píng)論 0 7
  • 目錄 [1. 順序查找][2. 二分查找][3. 插值查找][4. 斐波那契查找][5. 樹表查找][6. 分塊查...
    jiangmo閱讀 17,769評(píng)論 4 6
  • 本文的整理基于:http://blog.csdn.net/qq_23217629/article/details/...
    阿阿阿阿毛閱讀 1,607評(píng)論 0 3
  • 人的自我總是不可遏制的高估或低估自己,從而高估或低估現(xiàn)實(shí)中自我的投射,你愛的人與物。這樣的后果是總是認(rèn)不清自己。認(rèn)...
    201701閱讀 110評(píng)論 0 0