小朋友學資料結構(13):斐波契那查詢
《大話資料結構》第八章8.4節介紹了斐波契那查詢。
斐波那契查詢的理解難點就一個:為什麼需要把陣列長度擴充到f[k]-1而不是f[k]或者f[k+1]? 這是為了能正確遞迴計算mid值,看下圖可發現 f[k]-1 = (f[k-1] + f[k-2]) - 1 = (f[k-1]-1) + 1 + (f[k-2]-1),中間的1就是我們二分的錨點mid,如果目標在左區,陣列長度就縮到(f[k-1]-1),如果在右區,陣列長度就縮到(f[k-2]-1),否則就等於mid完成查詢。而(f[k-1]-1)又能拆成(f[k-2]-1)+1+(f[k-3]-1),這樣遞迴分割下去就能不斷的縮小區間直至找到目標。
假如擴充到f[k]或f[k+1],則不能分割出mid點。
瞭解小朋友學程式設計請加QQ307591841(微信與QQ同號),或QQ群581357582。 關注公眾號請掃描二維碼
相關推薦
小朋友學資料結構(13):斐波契那查詢
《大話資料結構》第八章8.4節介紹了斐波契那查詢。 斐波那契查詢的理解難點就一個:為什麼需要把陣列長度擴充到f[k]-1而不是f[k]或者f[k+1]? 這是為了能正確遞迴計算mid值,看下圖可發現 f[k]-1
小朋友學資料結構(16):基於鄰接矩陣的的深度優先遍歷和廣度優先遍歷
觀察下面兩個無向圖: 這兩個圖其實是一樣的,只是畫法不同罷了。第一張圖更有立體感,第二張圖更有層次感,並且把A點置為頂點(事實上圖的任何一點都可以做為頂點)。 一、用陣列來存放頂點 vexs[0] = ‘A’ vexs[1] = ‘B’ vexs[2] = ‘C’ ve
小朋友學資料結構(1):約瑟夫環的連結串列解法、陣列解法和數學公式解法
約瑟夫環(Josephus)問題是由古羅馬的史學家約瑟夫(Josephus)提出的,他參加並記錄了公元66—70年猶太人反抗羅馬的起義。約瑟夫作為一個將軍,設法守住了裘達伯特城達47天之久,在城市淪陷之後,他和40名死硬的將士在附近的一個洞穴中避難。在那裡,這些
小白學 Python 資料分析(13):Pandas (十二)資料表拼接
![](https://cdn.geekdigging.com/python/spider-blog/Python_logo.jpg) > 人生苦短,我用 Python 前文傳送門: [小白學 Python 資料分析(1):資料分析基礎](https://www.geekdigging.com/2020
JavaScript 資料結構(一): 連結串列
前言 從實用性角度來說,連結串列對Javascript 來說沒有任何價值,為什麼呢? 我們先了解連結串列的特性,這個特性我們放在c++前提下來說,因為 這個特性是 根據 記憶體特性 來闡述的,Javascript 不存在記憶體操作,所有資料型別,本質性繼承Object 物件,而Ob
資料結構(三):線性表
一、線性表及其邏輯結構 1、線性表的定義 線性表是具有相同特性的資料元素的一個有限序列。 該序列中所含的元素個數叫做線性表的長度,用 n表示(n>=0)。當 n=0時,表示線性表是一個空表,即表中不包含任何資料元素。 線性表中的第一個元素叫做表頭元素,最後一
資料結構(二):演算法及其描述
一、演算法及其描述 1、什麼是演算法 資料元素之間的關係有邏輯關係和物理關係,對應的操作有邏輯結構上的操作功能和具體儲存結構上的操作實現。 把 具體儲存結構上的操作實現方法 稱為演算法。 確切地說,演算法是對特定問題求解步驟的一種描述,它是指令的有限序列,其中每一
資料結構(一):什麼是資料結構
一、什麼是資料結構 1、資料結構的定義 資料:從計算機的角度來看,資料是所有能被輸入到計算機中且能被計算機處理的符號的集合。它是計算機操作的物件的總稱,也是計算機處理資訊的某種特定的符號表示形式(二進位制碼的抽象表示?)。 資料元素:資料元素是資料中的一個個體
再談資料結構(一):棧和佇列
1 - 前言 棧和佇列是兩種非常常用的兩種資料結構,它們的邏輯結構是線性的,儲存結構有順序儲存和鏈式儲存。在平時的學習中,感覺雖然棧和佇列的概念十分容易理解,但是對於這兩種資料結構的靈活運用及程式碼實現還是比較生疏。需要結合實際問題來熟練佇列和棧的操作。 2 - 例題分析 2.1
小朋友學經典演算法(14):回溯法和八皇后問題
一、回溯法 回溯法(探索與回溯法)是一種選優搜尋法,又稱為試探法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為“回溯點”。 二、八皇后問題 (一)問
小朋友學C語言(42):gets和fgets
一、gets()函式 原型:char *gets(char *str); 標頭檔案:stdio.h 例1 #include <stdio.h> int main() { char str[10]; gets(str); puts(str)
資料結構(C++):順序表的實現
包含取值、查詢、插入、刪除等功能: #include <iostream> using namespace std; typedef int ElemType; //定義 #define MAXSIZE 100 typedef struct {ElemTyp
再談資料結構(四):排序與查詢
1 - 引言 雖然C++中的STL庫中提供了許多排序和查詢的方法。但是我們還是需要了解一下排序和查詢內部的原理,下面讓我們學習一下各類排序與查詢演算法 2 - 歸併排序 第一種高效的排序演算法是歸併排序,按照分治三步法,對歸併排序演算法介紹如下: 劃分問題:把序列分成
資料結構(1):陣列
1.陣列優勢 (1)快速查詢 (2)適用於有語境的情況 2.製作私有陣列 (1)使用泛型,從而可以實現儲存多種型別資料 (2)可以動態擴容或者縮容 (3)實現增刪改查基本操作 3.java實現 public class ArrayDynamic<E> {
資料結構(C++):Unit2_1
將兩個遞增的有序連結串列合併為一個遞增的有序連結串列。要求結果連結串列扔使用原來兩個連結串列的儲存空間,不另外佔用其他的儲存空間。表中不允許有重複的資料。 #include <iostream> using namespace std; typedef str
無鎖資料結構(1):簡介
希望本文能成為無鎖(lock free)資料結構系列文章一個好的開端。我很樂意與社群分享我的經歷,這個系列就什麼是無鎖資料結構、如何實現以及 STL 容器概念是否適用於無鎖容器,何種情形下適合應用無鎖資料結構做一些分享。 談論無鎖資料結構,必然要談論諸如原子操作、程
c語言實現通用資料結構(二):通用佇列
注意佇列中只儲存了指標,沒有儲存實際的資料。 標頭檔案 myQueue.h #ifndef MYQUEUE_H_INCLUDED #define MYQUEUE_H_INCLUDED #include "myList.h" typedef My
淺談演算法和資料結構(11):雜湊表
在前面的系列文章中,依次介紹了基於無序列表的順序查詢,基於有序陣列的二分查詢,平衡查詢樹,以及紅黑樹,下圖是它們在平均以及最差情況下的時間複雜度: 可以看到在時間複雜度上,紅黑樹在平均情況下插入,查詢以及刪除上都達到了lgN的時間複雜度。 那麼
淺談演算法和資料結構(7):二叉查詢樹
前文介紹了符號表的兩種實現,無序連結串列和有序陣列,無序連結串列在插入的時候具有較高的靈活性,而有序陣列在查詢時具有較高的效率,本文介紹的二叉查詢樹(Binary Search Tree,BST)這一資料結構綜合了以上兩種資料結構的優點。 二叉查詢樹具有很高的靈活性
挖掘演算法中的資料結構(四):堆排序之 二叉堆(Heapify、原地堆排序優化)
不同於前面幾篇O(n^2)或O(n*logn)排序演算法,此篇文章將講解另一個排序演算法——堆排序,也是此係列的第一個資料結構—–堆,需要注意的是在堆結構中排序是次要的,重要的是堆結構及衍生出來的資料結構問題,排序只是堆應用之一。 此篇涉及的知識點有: 堆