1. 程式人生 > >查詢演算法整理(一)---靜態查詢表:順序表查詢、折半(判定樹)查詢、靜態查詢樹

查詢演算法整理(一)---靜態查詢表:順序表查詢、折半(判定樹)查詢、靜態查詢樹

查詢在實際應用中也是最為常見的。通常我們要在一個集合中查詢某一個數或多個數,這個集合稱為查詢表。查詢表分為靜態查詢表動態查詢表

靜態查詢表:在查詢表中查詢某個“特定的”元素,查詢表的大小不會改變,即僅限於查詢某個元素,查詢表不會被修改。

動態查詢表:在查詢過程向查詢表中刪除或插入一個元素,即若在查詢過程中同時插入查詢表中不存在的元素,或者從查詢表中刪除已存在的某個元素。

本小節整理的是靜態查詢表幾種典型的查詢演算法。

1、順序表的查詢

原理:從表中最後一個記錄開始,逐個進行記錄的關鍵詞與給定值的比較,若某個記錄的關鍵詞與給定值相等,則查詢成功;反之,若直到第一個記錄,其關鍵詞與給定值都不相等,則查詢不成功。

演算法實現:

	int SearchSeq(int arr[],int key){//arr為查詢表,key為待查詢的元素
		for(int i=arr.length-1;arr[i]!=key;--i);
		return i;//返回查詢表中的下標;若i=-1,則表示沒有查詢到
	}

根據上述演算法可知,若查詢元素不在查詢表中,則需要比較n次,因而執行時間最壞情況是O(n)。

2、折半(判定樹、二分查詢)查詢

原理:對於有序的查詢表,可採用折半查詢,因為查詢表中的元素是有序的,我們可以先確定待查元素所在查詢表中的範圍,然後逐步縮小查詢範圍直到找到或找不到為止。

演算法的實現:

	int SearchBin(int arr[],int key){
		int low=0;
		int high=arr.length;
		while(low<high){
			int mid=(low+high)/2;
			if(arr[mid]==key) return mid;
			else if(arr[mid]>key) high=mid-1;
			else low=mid+1;
		}
	}

例如:已知如下11個數據元素的有序表:

3671419243035566588

查詢元素30

起始,low指向a[0]high指向a[10]mid=(0+10)/2=5,即mid指向a[5],如圖所示:


由於查詢元素key=30大於a[mid],所以low=mid+1=6mid=(6+10)/2=8,再一次進行比較:


此時,查詢元素key=30小於a[mid],所以high=mid-1=7mid=(6+7)/2=6,再一次進行比較:


此時,查詢元素key=30等於a[mid],查詢成功,返回mid=6

折半查詢每進行一次比較,元素下次查詢的範圍將縮小為原來的一半,因此查詢長度不會超過└ log2n ┘+1,即執行時間最壞情況是O(logn)。

3、靜態樹表的查詢

對於有序表查詢,若有序表中各記錄的查詢概率相等時,折半查詢的效率是最優的。若有序表中各記錄的查詢概率不相等時,則需要建立靜態最優查詢樹。

相關推薦

查詢演算法整理---靜態查詢表順序查詢折半判定查詢靜態查詢

查詢在實際應用中也是最為常見的。通常我們要在一個集合中查詢某一個數或多個數,這個集合稱為查詢表。查詢表分為靜態查詢表和動態查詢表。 靜態查詢表:在查詢表中查詢某個“特定的”元素,查詢表的大小不會改變,即僅限於查詢某個元素,查詢表不會被修改。 動態查詢表:在查詢過程向查詢表中

靜態查詢表順序查詢折半查詢分塊查詢

引言:        除去各種線性和非線性的資料結構外,還有一種在實際應用中大量使用的資料結構——查詢表。查詢表是由同一型別的資料元素構成的集合。        對查詢表經常進行的操作有:1、查詢某個"特定的"資料元素是否在查詢表中;2、檢索某個"特定的"資料元素的

第三周——項目順序的基本運算3

.com zzu 貢獻 userinfo get cor xor vmw left 乒接鍬綱仆油芬郵撾贅當http://www.docin.com/easin122 懷關嬌子識拋柏燦講燎http://www.docin.com/pssf18177 拱靶市古紫谷坦搜蔥滴曬

寒假 10 天都在用鏈實現,還沒改完

單元 鏈表 這一 就是 body sta 內部 使用 實現 就是一些寫的時候註意到的東西,還有一些要在註釋裏看 : 初始化一個具有靜態存儲時期的變量,只能使用常量 代碼塊內部的變量,存儲時期可以是代碼塊執行時間,也可以通過static改為靜態;但是鏈接只能是空鏈接,就是

分鐘小講堂彈性裸金屬服務器神龍

裸金屬 text img 虛擬機 ecs image 國內 活性 ado 阿裏雲ECS有一款明星產品:彈性裸金屬服務器(神龍)。由於名字比較長,又常常被媒體曝光,很多朋友不明覺厲。我們今天來簡單了解一下它的誕生背景和主要特點。 c0a3168ff4a32c370ceee1c

個人的武林滲透測試常規思路分析

寫在前面 滲透測試是門技術,也是一門藝術。 這門技術(藝術)一開始也不是每個人都會的,正所謂沒有人一出生就會走路,從不懂到入門到深諳,一步步慢慢來,每個人都是這樣;但是在這個過程中,思路無疑是最重要的,沒有做不到只有想不到,就跟咱們高中解題時有了思路就迎刃而解一樣,手裡拿著鏟子(技巧知識)但不是道從何挖起

計算機網路_驗證UDP特性次未將報文資料讀完,剩餘部分將被丟棄

一、 思路 伺服器端和客戶端進行報文互動,客戶端每次向伺服器端傳送訊息,伺服器端只讀取5個有效字元,觀察情況: 二、 程式碼實現 #include<netinet/in.h> //struct sockaddr; struct sockaddr_in; #incl

資料結構實現動態順序的各項介面初始化,銷燬,尾插尾刪,頭插頭刪,刪除,排序,查詢

實現動態順序表 SeqList.h #pragma once ////靜態順序表 //#define N 10 //typedef int SLDateType; //typedef struct SeqList //{ // int _a[N];//陣列 /

Citus資料分片分佈研究 在工作節點直接操作

(本文中凡是未顯式指出的SQL,均在協調節點上執行) 工作節點 mydb1=# SELECT * FROM master_get_active_worker_nodes(); node_name | node_port ---------

筆記異常處理try/catch的應用例子finally待整理

題目:判斷傳入的字串是否為ip地址 /** * 判斷傳入的字串是否為ip地址 * @param ip * @return * @throws Exception */ public static boolean isIP(String ip)

【python】python資料結構——線性順序的實現

前言 這一系列文章將介紹基於python語言的資料結構,主要涉及線性表、字串、棧和佇列、二叉樹和樹、圖、字典和集合、排序等。 線性表及分類 線性表是一類元素序列的抽象,是某類元素的集合,記錄著元素之間的順序關係。python中的list和tuple都支援線性表的需要,只是t

C#復習筆記3--C#2解決C#1的問題進入快速通道的委托

包含 問題 道理 一次 簡化 linq base 啟動 外部 委托 前言:C#1中就已經有了委托的概念,但是其繁雜的用法並沒有引起開發者太多的關註,在C#2中,進行了一些編譯器上的優化,可以用匿名方法來創建一個委托。同時,還支持的方法組和委托的轉換。順便的,C#2中增加了委

軟體工程之程式編碼④原始碼“文件化”識別符號命名,註釋,程式視覺組織

      編碼的目的是使用選定的程式設計語言,把模組的過程描述翻譯為用該語言書寫的源程式。源程式應該正確可靠、簡明清晰,而且具有較高的效率。軟體工程專案對程式碼編寫的要求,不僅僅是源程式語法上的正確性,也不只是源程式中沒有各種錯誤,還要求源程式具有良好的結構性和良好的

資料結構C++順序的實現

包含取值、查詢、插入、刪除等功能:  #include <iostream> using namespace std; typedef int ElemType; //定義 #define MAXSIZE 100 typedef struct {ElemTyp

順序和連結串列Sqlist&LNode

寫在前面的廢話:這是應某人(不點名)的煽風點火整理來的一篇關於線性表中順序表和連結串列的區別 ——————————————————————————————————————————— 眾所周知,線性表是一個比較靈活的儲存空間,其中有兩種儲存格式:線性表和連結串列,下文儘量詳

UML 交互圖順序圖和協作圖轉載

-a 過程 ges .cn 表達 用戶 uml article 交互關系 順序圖和協作圖統稱為“交互圖”,順序圖著重體現交互的時間順序,協作圖著重體現交互對象間的靜態連接關系。 順序圖精確表達用戶與系統的復雜交互過程。 順序圖用於描述進出系統的信息流

資料結構——線性順序單鏈雙鏈C++

內容概要:​​​​​​​ 1.程式碼部分: 線性表抽象類 順序表類 單鏈表類 雙鏈表類 主函式 2.基本概念及注意事項 程式碼(測試環境VS2017): //線性表ADT類的定義:ADT_List.h template <typena

python資料結構單鏈

一: 連結串列(順序表)和列表的區別: 比如在電影院,你們10個非常要好的朋友去看電影。因為你們10個的關係非常好所以決定要坐在一起。然後你們去電影院一看,發現沒有10個連在一起的座位了。此時會有兩種情況: 1:你們仗著人多勢眾,把其他人趕走,硬是騰出了10個連在一起的座位。你們正準備坐

第三週實踐專案1--順序的基本運算3插入.刪除資料,初始化.銷燬線性

問題: /* Copyright (c)2015,煙臺大學計算機與控制工程學院 All rights reserved. 檔名稱:專案1--順序表的基本運算(3)插入.刪除資料,初始化.銷燬線性表.cpp

【OpenCV3經典程式設計100例】242D特徵Harris角點檢測cornerHarris

一、2d特徵相關知識Learn about how to use the feature points detectors, descriptors and matching inside OpenCV