修煉內功---資料結構與演算法18---稠密索引
前面我們提到的二分查詢適用於有序線性表的查詢
此外針對二分查詢還有升級版的插值查詢
不過一般我們使用二分查詢就可以了
二分查詢不適用於高速增長的海量資料
因為維護這個排序非常麻煩
所以我們引出索引這種資料結構
索引是為了加快查詢速度而設計的一種資料結構
索引就是把一個關鍵字與它對應的記錄相關聯的過程
一個索引由若干索引項構成
每個索引項至少包含關鍵字和其對應記錄在儲存器中的位置等資訊
索引技術是組織大型資料庫和磁碟檔案的一種重要技術
索引技術分為線性索引、樹形索引和多級索引
這裡我們只介紹線性索引
所謂線性索引就是將索引項集合組織為線性結構,也稱索引表
線上性索引中,我們重點介紹三種:稠密索引、分塊索引和倒排索引
首先是稠密索引
稠密索引是指線上性表中,將資料集中的每個記錄對應一個索引項,就像我們上面示例圖中的那樣。以主鍵為例,可以將其抽象化如下
對於稠密索引這個索引表來說
索引項一定按照關鍵碼有序排列,這樣可以應用二分查詢,以免索引查詢本身影響效能。
可見,稠密索引效能可以做到和二分查詢相當(找到對應關鍵碼就可以通過指標直接指向對應記錄),
但是索引項長度和資料集一樣長,空間複雜度高,如果資料太多需要存放到磁碟上,反覆讀取磁碟對效能影響很大。
因此,我們又引入了分塊索引
相關推薦
修煉內功---資料結構與演算法18---稠密索引
前面我們提到的二分查詢適用於有序線性表的查詢 此外針對二分查詢還有升級版的插值查詢 不過一般我們使用二分查詢就可以了 二分查詢不適用於高速增長的海量資料 因為維護這個排序非常麻煩 所以我們引出索引這種資料結構 索引是為了加快查詢速度而設計的一種資料結構 索引就是把一個關鍵字與它對應的記錄相關
修煉內功---資料結構與演算法19---分塊索引
提到了稠密索引的缺點,進而引出今天的主題 —— 分塊索引 為了減少索引項個數,我們對資料集進行分塊,並使其分塊有序 然後再給每個分塊建立一個索引項(索引值是分塊中最大關鍵碼),至於分塊內部,則不管其有序性,從而減少索引項的個數 在查詢的時候在索引項中通過二分查詢找到指
修煉內功---資料結構與演算法16---二分法變形2
在給定排序序列中查詢第一個大於等於給定值的元素 所不同的是判斷節點不一樣了,我們之前的需求都是查詢等於給定值 現在變成了大於等於給定值,所以我們要在 $nums[$mid] >= $num 這個判斷條件上做文章 思路還是和之前兩個變形版本類似 當 $mid 已經是最左邊的元素,
修煉內功---資料結構與演算法15---二分法變形1
除了正常的二分查詢,還有很多二分查詢的變形版本 符合標準的二分查詢條件的序列一般是比較理想的情況,如果要查詢的元素在序列中有多個怎麼辦? 在一個給定排序序列中查詢第一個等於給定值的元素 其實關鍵節點就在於在序列中找到值等於待查詢元素值時的處理 如果此時 $mid 位置已經到了序列的最
修煉內功---資料結構與演算法14---二分法查詢
所謂二分查詢,針對的是一個有序的資料集合(這點很重要),查詢思想有點類似分治思想。每次都通過跟區間的中間元素對比,將待查詢的區間縮小為之前的一半,直到找到要查詢的元素,或者區間被縮小為 0。注意到二分查詢針對的必須是已經排序過的有序陣列,否則不能使用該演算法。 <?php functio
修煉內功---資料結構與演算法12---快速排序
https://blog.csdn.net/adusts/article/details/80882649 這個部落格寫的很好 <?php function quick_sort($nums) { if (count($nums) <= 1) { ret
修煉內功---資料結構與演算法11---歸併排序
所謂歸併排序 指的是如果要排序一個數組 我們先把陣列從中間分成前後兩部分,然後對前後兩部分分別排序,再將排好序的兩部分合並在一起,這樣整個陣列就都有序了 歸併排序使用了分治思想 分治,顧名思義,就是分而治之,將一個大問題分解成小的子問題來解決 歸併排序就是通過遞迴來實現的 這
修煉內功---資料結構與演算法10---選擇排序
選擇排序演算法的實現思路有點類似插入排序 也分已排序區間和未排序區間 但是選擇排序每次會從未排序區間中找到最小的元素,將其放到已排序區間的末尾 <?php /** * 選擇排序演算法實現 */ function selection_so
修煉內功---資料結構與演算法9---插入排序
插入排序的原理 我們將陣列中的資料分為兩個區間,已排序區間和未排序區間。 初始已排序區間只有一個元素,就是陣列的第一個元素。 插入演算法的核心思想是取未排序區間中的元素,在已排序區間中找到合適的插入位置將其插入,並保證已排序區間資料一直有序。 重複這個過程,直到未排序區間中元素為空,演算法結束。
修煉內功---資料結構與演算法8---氣泡排序
在選擇排序演算法的時候,通常會根據以下幾個維度來考慮: 1、時間複雜度 2、空間複雜度(對記憶體空間的消耗) 3、演算法的穩定性(如果待排序的序列中存在值相等的元素,經過排序之後,相等元素之間原有的先後順序不變) 氣泡排序只會操作相鄰的兩個資料。 每次冒泡操作都會對相鄰的兩個元素進行比較,看是
修煉內功---資料結構與演算法5---棧
<?php /** * 通過 PHP 陣列實現簡單的順序棧 */ class SimpleStack { private $_stack = []; private $_size = 0; public function __construct($size =
修煉內功---資料結構與演算法29---二叉樹的儲存
樹和二叉樹的定義和特性,樹這種結構不能簡單通過線性表的前後關係來儲存,線上性表中,一個節點只有至多一個前驅節點和至多一個後驅節點,樹則不然,一個節點可能有多個後驅節點,這個時候,我們需要通過更加複雜的結構才能儲存樹。二叉樹是一種特殊的樹,比多叉樹要簡單,因為特定節點至多隻有兩個節點,這就極大簡化了相
Java 內功修煉 之 資料結構與演算法(一)
一、基本認識 1、資料結構與演算法的關係? (1)資料結構(data structure): 資料結構指的是 資料與資料 之間的結構關係。比如:陣列、佇列、雜湊、樹 等結構。 (2)演算法: 演算法指的是 解決問題的步驟。 (3)兩者關係: 程式 = 資料結構 + 演算法。 解決問題可以有很多種方式,
Java 內功修煉 之 資料結構與演算法(二)
一、二叉樹補充、多叉樹 1、二叉樹(非遞迴實現遍歷) (1)前提 前面一篇介紹了 二叉樹、順序二叉樹、線索二叉樹、哈夫曼樹等樹結構。 可參考:https://www.cnblogs.com/l-y-h/p/13751459.html#_label5_1 (2)二叉樹遍歷 【遞迴與非遞迴實現:】
資料結構與演算法18-圖的遍歷
從圖中某一個頂點出發訪遍圖中其餘頂點,且使每個頂點權被訪問一次,這一過程就叫做圖的遍歷(Traversing Graph)。 深度優先遍歷(Depth_First_Search) 從圖中某個頂點v出發,訪問此頂點,然後從v的未被訪問的鄰接點出發深度優先遍歷圖,直至
資料結構與演算法24-線性索引查詢
線性索引查詢 有此資料集可能增長非常快,例如,某些微博網站或大型論壇的帖子和回覆總數每天都是成百萬上千萬條,或者一些伺服器的日誌資訊記錄也可能是海量資料,要保證記錄全部是按照當中的某個關鍵字有序,其時間代價是非常高昂的,所以這種資料都是按先後順序儲存的。 對於這樣的查詢表,我們如何能夠快速
資料結構與演算法內功修煉之——為什麼學習資料結構和演算法及如何高效的學習資料結構和演算法
什麼是資料結構和演算法 用一句話總結資料結構和演算法,資料結構和演算法是用來儲存資料和處理資料的;其中的儲存指的是通過怎樣的儲存結構來儲存資料,而處理就是通過怎樣的方式或者方法處理資料 為什麼學習資料結構和演算法 寫出更加高效能的程式碼 演算法,是一種解決問題的思路
【Java】 大話資料結構(18) 排序演算法(5) (直接插入排序) 資料結構與演算法合集 資料結構與演算法合集
本文根據《大話資料結構》一書,實現了Java版的直接插入排序。 更多:資料結構與演算法合集 基本概念 直接插入排序思路:類似撲克牌的排序過程,從左到右依次遍歷,如果遇到一個數小於前一個數,則將該數插入到左邊所有比自己大的數之前,也就是說,將該數前面的所有更大的數字都後移一位,空出來的位置放入該數。
python資料結構與演算法(18)
樹與樹演算法樹的概念樹(英語:tree)是⼀種抽象資料型別(ADT)或是實作這種抽象資料型別 的資料結構,⽤來模擬具有樹狀結構性質的資料集合。它是由n(n>=1)個 有限節點組成⼀個具有層次關係的集合。把它叫做“樹”是因為它看起來像⼀ 棵倒掛的樹,也就是說它是根朝上,⽽葉朝下的。它具有以下的特點:每個節
資料結構與演算法題目集7-18——銀行業務佇列簡單模擬
我的資料結構與演算法題目集程式碼倉:https://github.com/617076674/Data-structure-and-algorithm-topic-set 原題連結:https://pintia.cn/problem-sets/15/problems/825 題目描述: