經典查詢演算法總結 上

2021-10-04 22:24:29 字數 3944 閱讀 7835

順序查詢

二分查詢

插值查詢

斐波那契查詢

樹表查詢

分塊查詢

雜湊查詢

一、順序查詢描述

遍歷陣列,依次比較,直到找到目標元素。

條件

陣列可以亂序可以有序,只要是可遍歷的線性結構。

平均查詢次數:(n+1)/2

時間複雜度:o(n)

**:

public

intseqsearch

(int

array,

int target)

}return-1

;}

二、二分查詢(折半查詢)描述

每次將中點的元素與target做比較,若大於target,(以公升序排列為 例)查詢區間改為左半部分;若小於target,查詢區間改為右半部分,在新的查詢區間裡再找中點的元素與target作比較,若不相等,再改變查詢區間…直到找到目標元素(即中點元素等於target)。

條件

陣列必須是有序的

平均查詢次數:log2

n時間複雜度:o(logn)

**

public

static

intbinarysearch

(int

array,

int target)

else

if(array[mid]

> target)

else

}return-1

;}

三、插值查詢描述

插值查詢是二分查詢的改進,二分查詢是每次對陣列下標的mid處查詢,插值查詢加入了陣列中元素值的影響,每次從自適應的mid處查詢。把二分法的(以陣列公升序排列為例)mid = (right+left)/2 = left+(right-left)/2公式,改為

mid = left+(right-left)*(target-array[left])/(array[right]-array[left])

條件

陣列必須是有序的

時間複雜度:o(loglogn)

**

public

static

intinsertvaluesearch

(int

array,

int target)

else

if(array[mid]

> target)

else

}return-1

;}

四、斐波那契查詢描述

斐波那契數列:fibonacci[0]=fibonacci[1]=1,

fibonacci[n]= fibonacci[n-1]+fibonacci[n-2]

n越大時fibonacci[n]/fibonacci[n-1]的值越接近**比例0.618,

斐波那契查詢按照斐波那契函式進行分割,對於長度為fibonacci[n]的陣列,進行分割時分割成fibonacci[n-1]長的前半部分和fibonacci[n-2]長的後半部分。找出最接近陣列長度且大於陣列長度的fibonacci函式值,多出的部分全部補充為陣列最後乙個元素。便於理解如圖

條件:陣列必須是有序的

時間複雜度:o(logn)

**

//斐波那契查詢

private

static

int maxsize =20;

public

static

int[

]getfibonacci()

return fib;

}public

static

intfibonaccisearch

(int

array,

int target)

//構造k長度的新陣列並把array裡的元素拷貝過來

int[

] temp = arrays.

copyof

(array, fib[k]);

//對新陣列進行元素補充

for(

int i = right +

1;i < k;i ++

)while

(left <= right)

else

if(temp[mid]

< target)

else

else}}

return-1

;}

五、樹表查詢n +1,時間複雜度為o(logn)

若果二叉搜尋樹完全不平衡,則其深度可能達到n,查詢效率退化為o(n).

所以,一般二叉搜尋樹的查詢時間複雜度在o(logn)和o(n)之間。

**

//簡單樹表查詢(二叉搜尋樹)

public

static treenode sortarraytotree

(int

array)

public

static treenode buildtree

(int

array,

int start,

int end)

else

}public

static treenode binarytreesearch

(int

array,

int target)

}//若根節點小於目標元素,則目標元素在其右子樹上

if(temp.data < target)}if

(temp.data == target)

}return null;

}

二叉樹的基本資料型別:

public

class

treenode

public

void

setdata

(int data)

public treenode getleft

(treenode left)

public

void

setleft

(treenode left)

public treenode getright

(treenode right)

public

void

setright

(treenode right)

public treenode getroot

(treenode root)

public

void

setroot

(treenode root)

public

treenode

(int data)

public

treenode()

}

分塊查詢和雜湊查詢待更

排序演算法總結(上)

實現 public static void insertsort int a a j 1 temp 把待排序的元素temp插入騰出位置的 j 1 system.out.println system.out.println 1.直接排序之後 for int i 0 i a.length i 解釋 實現...

Hibernate單錶查詢總結(上)

hibernate單錶查詢總結 上 搭建環境不再贅述,有興趣的可以參考之前的部落格 hibernate環境搭建 鏈結 表只包含三個字段 姓名 年齡 成績,在前面的博文裡已經配置了hibernate.cfg.xml檔案,這裡就直接插入資料 public void testreadlydata sess...

經典演算法總結

一 緒論 1 最大連續子陣列 給定乙個陣列,求它的連續子陣列,使得該子陣列的和最大 解法 1 暴力法 2 分治法 3 分析法 3 動態規劃法 2 查詢旋轉陣列的最小值 3 零子陣列 4 lcs 最長公共子串行 兩個序列x和y的公共子串行中,長度最長的那個,定義為x和y的最長公共子串行 lcs可以描述...