国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【算法系列 | 12】深入解析查找算法之—斐波那契查找

這篇具有很好參考價值的文章主要介紹了【算法系列 | 12】深入解析查找算法之—斐波那契查找。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【算法系列 | 12】深入解析查找算法之—斐波那契查找,算法系列,贈書活動,算法,斐波那契查找

序言

心若有陽光,你便會看見這個世界有那么多美好值得期待和向往。

決定開一個算法專欄,希望能幫助大家很好的了解算法。主要深入解析每個算法,從概念到示例。

我們一起努力,成為更好的自己!

今天第12講,講一下查找算法的—斐波那契查找

一、算法介紹

斐波那契查找算法是一種基于黃金分割的有序查找算法,通過斐波那契數(shù)列的特性,在有序序列中快速定位目標元素的位置。

1.1 原理介紹

它結(jié)合了二分查找和黃金分割的思想。這個算法的基本原理如下:

  1. 序列構(gòu)建: 首先,需要一個有序的數(shù)組或序列。這個數(shù)組的長度通常是斐波那契數(shù)列中的一個值,這有助于在查找過程中對數(shù)組進行分割。

  2. 斐波那契數(shù)列: 斐波那契數(shù)列是一組按以下遞歸關系定義的數(shù)字序列:F(0) = 0,F(xiàn)(1) = 1,F(xiàn)(n) = F(n-1) + F(n-2)(n > 1)。通常,斐波那契數(shù)列的前幾項是:0, 1, 1, 2, 3, 5, 8, 13, 21, ...

  3. 查找過程: 對于一個有序序列,首先選擇一個斐波那契數(shù)列中的值,使得這個值大于或等于待查找序列的長度,然后使用這個斐波那契數(shù)列的值將序列分成兩個部分。這兩個部分的長度之比就是相鄰兩個斐波那契數(shù)的比例。

  4. 比較: 比較要查找的元素與序列中分割點的元素。如果相等,則找到了目標元素;如果待查找元素小于分割點元素,繼續(xù)在前半部分進行查找;如果待查找元素大于分割點元素,繼續(xù)在后半部分進行查找。

  5. 迭代: 重復上述步驟,不斷縮小查找范圍,直到找到目標元素或確定元素不在序列中。

示例說明

假設有一個有序數(shù)組 arr,長度為 n,而 n 正好是斐波那契數(shù)列中的某個值。為了簡化,我們可以選擇 n 為斐波那契數(shù)列中的某個值,比如 F(5) = 5,所以 n = 5。那么,我們有一個有序數(shù)組 arr,長度為 5。

arr = [1, 3, 5, 7, 9]

接下來,我們要查找值為 5 的元素在數(shù)組中的位置。以下是斐波那契查找的步驟:

1.?選擇斐波那契數(shù)列的值: 在斐波那契數(shù)列中找到一個最小的值,使得 F(k) >= n,其中 k 是最小可能滿足的索引。在這個例子中,我們選擇 F(5) = 5。

?2.?分割數(shù)組: 將數(shù)組分成兩個部分,長度比例為斐波那契數(shù)列中的兩個相鄰值的比例。在這個例子中,我們有兩部分,長度比例是 3:2。

? ? ?arr_left = [1, 3, 5]?arr_right = [7, 9]

3.? 比較與查找: 比較要查找的元素(5)與分割點元素(arr[2] = 5)。如果相等,找到了目標元素。如果待查找元素小于分割點元素,繼續(xù)在前半部分進行查找。如果待查找元素大于分割點元素,繼續(xù)在后半部分進行查找。

?在這個例子中,5 等于分割點元素,所以我們找到了目標元素的位置。

4. 迭代: 重復上述步驟,直到找到目標元素或確定元素不在序列中。

1.2 優(yōu)缺點

優(yōu)點:

  1. 適用性廣泛: 斐波那契查找適用于有序序列,尤其在序列長度接近斐波那契數(shù)列的某個值時效果更佳。相較于二分查找,斐波那契查找能夠在某些特定情況下減少查找次數(shù)。

  2. 更好的平衡: 由于斐波那契查找使用黃金分割比例進行分割,使得分割后的兩個子序列的長度比例更加接近,有助于保持查找的平衡性。

  3. 相對均勻的分割: 斐波那契查找相對于其他分割方法,如二分查找,能夠產(chǎn)生更為均勻的分割,有助于在查找過程中更快地接近目標元素。

缺點:

  1. 數(shù)組長度限制: 斐波那契查找要求待查找的序列長度必須是斐波那契數(shù)列中的某個值,這在實際應用中可能不太靈活,特別是當數(shù)據(jù)規(guī)模不是恰好是斐波那契數(shù)列中的某個值時,可能需要對數(shù)據(jù)進行補齊。

  2. 比較次數(shù)不穩(wěn)定: 斐波那契查找在某些情況下可能會比二分查找效果更好,但并不是在所有情況下都表現(xiàn)更好。具體的性能取決于待查找數(shù)據(jù)的分布情況和序列的長度。在一些場景下,二分查找可能更為穩(wěn)定。

  3. 計算斐波那契數(shù)列: 為了選擇合適的斐波那契數(shù)列的值,需要事先計算斐波那契數(shù)列,這可能涉及到一些計算成本,特別是對于較大的數(shù)據(jù)集。

總體來說,斐波那契查找算法在某些特定條件下表現(xiàn)優(yōu)秀,但在實際應用中需要謹慎選擇,并根據(jù)具體情況考慮使用。在一些情況下,簡單的二分查找可能更加實用和高效。

1.3 復雜度

時間復雜度:

  1. 查找過程: 斐波那契查找的主要操作是不斷地縮小查找范圍,通過比較待查找元素與分割點元素來確定繼續(xù)在前半部分還是后半部分進行查找。在每一步操作中,都可以將待查找范圍縮小為原來的黃金分割比例,即約為 0.618

  2. 時間復雜度: 斐波那契查找的時間復雜度可以表示為 O(log n),其中 n 是待查找序列的長度。與二分查找相比,它的復雜度相對更低。

空間復雜度:

  1. 常數(shù)空間: 斐波那契查找算法的空間復雜度非常低。它只需要常數(shù)級別的額外空間來存儲一些中間變量,如斐波那契數(shù)列的值、分割點等。

  2. O(1): 因此,斐波那契查找的空間復雜度可以表示為 O(1)。

總體來說,斐波那契查找在時間復雜度和空間復雜度上都相對較低,這使得它在某些特定場景下成為一個有效的查找算法。

但需要注意,實際效果還受到數(shù)據(jù)分布等因素的影響,因此在選擇查找算法時,需要綜合考慮具體情況。

1.4 使用場景

斐波那契查找算法在一些特定的場景下表現(xiàn)良好,適用于如下情況:

  1. 有序序列: 斐波那契查找要求待查找的序列是有序的,因為它是基于比較來縮小查找范圍的。如果序列無序,需要先進行排序操作。

  2. 長度接近斐波那契數(shù): 算法對序列的長度有一定的要求,最好是恰好是斐波那契數(shù)列中的某個值。在實際應用中,可以選擇最接近并大于待查找序列長度的斐波那契數(shù)。

  3. 分布均勻: 如果數(shù)據(jù)在序列中的分布相對均勻,斐波那契查找可以更好地發(fā)揮其優(yōu)勢。這是因為它能夠在分割序列時保持更好的平衡。

  4. 查找頻繁但數(shù)據(jù)變動不頻繁: 如果對同一序列進行多次查找而且序列基本保持不變,斐波那契查找的一些前期計算可以提前完成,然后多次使用相同的計算結(jié)果進行查找,從而提高效率。

  5. 適用于內(nèi)存有限的情況: 斐波那契查找只需要常數(shù)級別的額外空間,因此在內(nèi)存有限的情況下比一些其他算法更為適用。

需要注意的是,斐波那契查找并不總是比其他查找算法更好,它在特定的條件下才會表現(xiàn)出色。在實際應用中,需要根據(jù)具體情況選擇最適合的查找算法。

二、代碼實現(xiàn)

2.1 Java代碼實現(xiàn)

2.1.1 代碼示例

public class FibonacciSearch {

    // 輔助函數(shù):生成斐波那契數(shù)列
    private static int[] generateFibonacci(int n) {
        int[] fibonacci = new int[n];
        fibonacci[0] = 0;
        fibonacci[1] = 1;

        for (int i = 2; i < n; i++) {
            fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
        }

        return fibonacci;
    }

    // 斐波那契查找算法
    public static int fibonacciSearch(int[] arr, int key) {
        int n = arr.length;
        
        // 生成斐波那契數(shù)列,找到最接近且大于等于 n 的值
        int[] fibonacci = generateFibonacci(n);
        int k = 0;
        while (fibonacci[k] < n) {
            k++;
        }

        // 將數(shù)組擴展到斐波那契數(shù)列的長度
        int[] temp = new int[fibonacci[k]];
        System.arraycopy(arr, 0, temp, 0, n);

        int low = 0;
        int high = n - 1;

        // 主要查找過程
        while (low <= high) {
            int mid = low + fibonacci[k - 1] - 1;

            if (key < temp[mid]) {
                high = mid - 1;
                k -= 1;
            } else if (key > temp[mid]) {
                low = mid + 1;
                k -= 2;
            } else {
                // 找到了目標元素,需要判斷返回的是原數(shù)組中的索引還是擴展數(shù)組中的索引
                return Math.min(mid, high);
            }
        }

        // 未找到目標元素
        return -1;
    }

    public static void main(String[] args) {
        int[] arr = {1, 3, 5, 7, 9, 11, 13, 15};
        int key = 7;

        int result = fibonacciSearch(arr, key);

        if (result != -1) {
            System.out.println("元素 " + key + " 在數(shù)組中的索引為:" + result);
        } else {
            System.out.println("元素 " + key + " 不在數(shù)組中");
        }
    }
}

2.1.2 代碼詳解

  1. generateFibonacci方法:生成斐波那契數(shù)列,參數(shù) n 表示生成數(shù)列的長度。

  2. fibonacciSearch方法:實現(xiàn)了斐波那契查找算法。首先,通過調(diào)用 generateFibonacci 方法生成斐波那契數(shù)列,然后找到最接近并大于等于數(shù)組長度的斐波那契數(shù)。接著,將原數(shù)組擴展到斐波那契數(shù)列的長度,再進行主要的查找過程。查找過程中,根據(jù)比較的結(jié)果不斷縮小查找范圍,直到找到目標元素或確定元素不在序列中。

  3. main方法:在這里,創(chuàng)建一個有序數(shù)組 arr,并調(diào)用 fibonacciSearch 方法查找元素 7 的索引。最后,輸出查找結(jié)果。

2.1.3 運行結(jié)果

元素 7 在數(shù)組中的索引為:3

2.2 Python代碼實現(xiàn)

2.2.1 代碼示例

def generate_fibonacci(n):
    """生成斐波那契數(shù)列"""
    fibonacci = [0, 1]
    while fibonacci[-1] < n:
        fibonacci.append(fibonacci[-1] + fibonacci[-2])
    return fibonacci


def fibonacci_search(arr, key):
    """斐波那契查找算法"""
    n = len(arr)

    # 生成斐波那契數(shù)列,找到最接近且大于等于 n 的值
    fibonacci = generate_fibonacci(n)
    k = 0
    while fibonacci[k] < n:
        k += 1

    # 將數(shù)組擴展到斐波那契數(shù)列的長度
    temp = arr + [arr[-1]] * (fibonacci[k] - n)

    low, high = 0, n - 1

    # 主要查找過程
    while low <= high:
        mid = low + fibonacci[k - 1] - 1

        if key < temp[mid]:
            high = mid - 1
            k -= 1
        elif key > temp[mid]:
            low = mid + 1
            k -= 2
        else:
            # 找到了目標元素,返回原數(shù)組中的索引
            return min(mid, n - 1)

    # 未找到目標元素
    return -1

if __name__ == '__main__':

    # 測試
    arr = [1, 3, 5, 7, 9, 11, 13, 15]
    key = 7
    
    result = fibonacci_search(arr, key)

    if result != -1:
        print(f"元素 {key} 在數(shù)組中的索引為:{result}")
    else:
        print(f"元素 {key} 不在數(shù)組中")

2.2.2 代碼詳解

  1. generate_fibonacci 函數(shù):用于生成斐波那契數(shù)列,直到數(shù)列的最后一個值大于等于給定的參數(shù) n。

  2. fibonacci_search 函數(shù):實現(xiàn)了斐波那契查找算法。首先,調(diào)用 generate_fibonacci 函數(shù)生成斐波那契數(shù)列,然后找到最接近并大于等于數(shù)組長度的斐波那契數(shù)。接著,將原數(shù)組擴展到斐波那契數(shù)列的長度,再進行主要的查找過程。查找過程中,根據(jù)比較的結(jié)果不斷縮小查找范圍,直到找到目標元素或確定元素不在序列中。

在測試部分,創(chuàng)建一個有序數(shù)組 arr,并調(diào)用 fibonacci_search 函數(shù)查找元素 7 的索引。最后,輸出查找結(jié)果。

2.2.3 運行結(jié)果

元素 7 在數(shù)組中的索引為:3

好啦,今天就到這里啦,下期見嘍~~??

三、圖書推薦

3.1 圖書名稱

圖書名稱:《Pandas數(shù)據(jù)分析》

Pandas是強大且流行的庫,是Python中數(shù)據(jù)科學的代名詞。這本書會介紹如何使用Pandas對真實世界的數(shù)據(jù)集進行數(shù)據(jù)分析,如股市數(shù)據(jù)、模擬黑客攻擊的數(shù)據(jù)、天氣趨勢、地震數(shù)據(jù)、葡萄酒數(shù)據(jù)和天文數(shù)據(jù)等。

Pandas使我們能夠有效地處理表格數(shù)據(jù),從而使數(shù)據(jù)整理和可視化變得更容易。等不及的小伙伴,可以點擊這個鏈接先睹為快?《Pandas數(shù)據(jù)分析》

【算法系列 | 12】深入解析查找算法之—斐波那契查找,算法系列,贈書活動,算法,斐波那契查找

3.2 圖書介紹?

【算法系列 | 12】深入解析查找算法之—斐波那契查找,算法系列,贈書活動,算法,斐波那契查找

【算法系列 | 12】深入解析查找算法之—斐波那契查找,算法系列,贈書活動,算法,斐波那契查找

3.3 參與方式

圖書數(shù)量:本次送出 2?本 ? !??!??????
活動時間:截止到 2024-01-09?12:00:00

抽獎方式:

  • 評論區(qū)隨機抽取小伙伴!

留言內(nèi)容,以下方式都可以:

  • 根據(jù)文章內(nèi)容進行高質(zhì)量評論

參與方式:關注博主、點贊、收藏,評論區(qū)留言?

3.4 中獎名單

???? 獲獎名單????

?中獎名單:請關注博主動態(tài)

名單公布時間:2024-01-09?下午文章來源地址http://www.zghlxwxcb.cn/news/detail-778629.html

到了這里,關于【算法系列 | 12】深入解析查找算法之—斐波那契查找的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【C/C++】斐波那契數(shù)列數(shù)列系列問題詳解

    【C/C++】斐波那契數(shù)列數(shù)列系列問題詳解

    ?? 博客主頁:??@披星戴月的賈維斯 ?? 歡迎關注:??點贊??收藏??留言 ??系列專欄:?? C++初階 ??勵志卓越可以成為你努力的動力,追求完美卻只會讓你身心俱疲。?? ??一起加油,去追尋、去成為更好的自己! ?? 斐波那契數(shù)列數(shù)列是我們學習遞歸的入門問題,是一

    2024年02月02日
    瀏覽(28)
  • 【算法學習】斐波那契數(shù)列模型-動態(tài)規(guī)劃

    【算法學習】斐波那契數(shù)列模型-動態(tài)規(guī)劃

    ? ? ? ? 我在算法學習過程中,針對斐波那契數(shù)列模型的動態(tài)規(guī)劃的例題進行了一個整理,并且根據(jù)標準且可靠一點的動態(tài)規(guī)劃解題思路進行求解類似的動歸問題,來達到學習和今后復習的必要。 ? ? ? ? 所謂的斐波那契數(shù)列模型,即當前狀態(tài)的值等于前兩種狀態(tài)的值之和。

    2024年02月04日
    瀏覽(27)
  • 【算法】斐波那契數(shù)列與臺風的故事

    在小島的一個海濱小鎮(zhèn)上,住著一個名叫蘇菲的女孩。蘇菲一家人靠海為生,她的生活簡單而樸素,與大自然和諧共生。每天,蘇菲都會來到海邊,欣賞那美麗的日出和日落,感受著大海的呼吸。 然而,小島的美麗風光并非一成不變。每年夏季,熱帶氣旋活躍,臺風頻繁登陸

    2024年02月10日
    瀏覽(24)
  • 【算法】斐波那契數(shù)列通項公式

    【算法】斐波那契數(shù)列通項公式

    如果數(shù)列 a n a_n a n ? 的遞推公式: a n = c 1 a n ? 1 + c 2 a n ? 2 a_n=c_1a_{n-1}+c_2a_{n-2} a n ? = c 1 ? a n ? 1 ? + c 2 ? a n ? 2 ? ------(1) 根據(jù)待定系數(shù)法,假設 a n ? x a n ? 1 = y ( a n ? 1 ? x a n ? 2 ) a_n-xa_{n-1}=y(a_{n-1}-xa_{n-2}) a n ? ? x a n ? 1 ? = y ( a n ? 1 ? ? x a n ? 2 ?

    2023年04月24日
    瀏覽(17)
  • 算法:動態(tài)規(guī)劃---斐波那契和最短路徑

    算法:動態(tài)規(guī)劃---斐波那契和最短路徑

    從本篇開始總結(jié)的是動態(tài)規(guī)劃的一些內(nèi)容,動態(tài)規(guī)劃是算法中非常重要的一個版塊,因此也是學習算法中的一個重點,在學習動態(tài)規(guī)劃前應當要把動態(tài)規(guī)劃的基礎知識學習一下 動態(tài)規(guī)劃既然是一個新的算法,這個名字也是新名字,那么就要首先明確這個算法的名字代表什么含

    2024年01月25日
    瀏覽(23)
  • C語言例題(二維數(shù)組)【轉(zhuǎn)置矩陣】【成績登記】【斐波那契】【簡單矩陣查找】【螺旋數(shù)陣】【一維數(shù)組轉(zhuǎn)二維數(shù)組】

    C語言例題(二維數(shù)組)【轉(zhuǎn)置矩陣】【成績登記】【斐波那契】【簡單矩陣查找】【螺旋數(shù)陣】【一維數(shù)組轉(zhuǎn)二維數(shù)組】

    例一:轉(zhuǎn)置矩陣 程序: 輸出:通過b[j][i] = a[i][j];這一步實現(xiàn)了轉(zhuǎn)置 進階:用6個1~20內(nèi)的隨機數(shù)按行的順序生成一個a[2][3]的矩陣,并輸出它的轉(zhuǎn)置矩陣 輸出: 例2.登記某班三人的數(shù)學、英語兩門課程的成績。 分析:此類問題可以通過使用3個一維數(shù)組來解決,也可以通過使用

    2024年02月03日
    瀏覽(32)
  • C語言經(jīng)典算法實例6:斐波那契數(shù)列

    C語言經(jīng)典算法實例6:斐波那契數(shù)列

    斐波那契數(shù)列指的是這樣一個數(shù)列:1,1,2,3,5,8,13,21,34,55,89… 這個數(shù)列從第3項開始,每一項都等于前兩項之和。 斐波那契數(shù)列的定義者,是意大利數(shù)學家萊昂納多·斐波那契(Leonardo Fibonacci),生于公元1170年,卒于1250年,籍貫是比薩。 他被人稱作“比薩的萊昂

    2024年02月02日
    瀏覽(16)
  • 解鎖動態(tài)規(guī)劃:從斐波那契到高效算法

    解鎖動態(tài)規(guī)劃:從斐波那契到高效算法

    ??作者介紹:10年大廠數(shù)據(jù)經(jīng)營分析經(jīng)驗,現(xiàn)任大廠數(shù)據(jù)部門負責人。 會一些的技術:數(shù)據(jù)分析、算法、SQL、大數(shù)據(jù)相關、python 歡迎加入社區(qū):碼上找工作 作者專欄每日更新: LeetCode解鎖1000題: 打怪升級之旅 python數(shù)據(jù)分析可視化:企業(yè)實戰(zhàn)案例 備注說明:方便大家閱讀,

    2024年04月15日
    瀏覽(23)
  • C++算法 —— 動態(tài)規(guī)劃(1)斐波那契數(shù)列模型

    C++算法 —— 動態(tài)規(guī)劃(1)斐波那契數(shù)列模型

    每一種算法都最好看完第一篇再去找要看的博客,因為這樣會幫你梳理好思路,看接下來的博客也就更輕松了。當然,我也會盡量在寫每一篇時都可以讓不懂這個算法的人也能邊看邊理解。 動規(guī)的思路有五個步驟,且最好畫圖來理解細節(jié),不要怕麻煩。當你開始畫圖,仔細閱

    2024年02月10日
    瀏覽(23)
  • [算法分析與設計] 2. 斐波那契堆及其應用

    一個優(yōu)先隊列需要支持的操作有 insert 插入元素 (x) 。 find-min 返回最小的元素。 delete-min 刪除最小的元素。 decrease-key 將一個元素 (x) 減小 (k) 。 (k geq 0) 。 常用于實現(xiàn)優(yōu)先隊列的數(shù)據(jù)結(jié)構(gòu)是 堆 。 需要注意的是,小根堆需要支持 decrease-key,大根堆需要支持 increase-key。對

    2024年02月08日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包