資料基本操作 查詢

2021-07-23 08:42:43 字數 1882 閱讀 3979

查詢(searching)

先上一道阿里的面試題吧

題意是這樣描述的,給定乙個m行n列的整數矩陣(如圖),每行從左到右,每列從上到下都是有序的。判斷乙個整數k是否在矩陣中出現的最優演算法,在最壞的情況下的時間複雜度

1 5 7 9

4 6 10 15

8 11 12 19

14 16 18 21

a–o(mxn)

b–o(m+n)

c–o(log(mxn))

d–o(log(m+n))

只有第一題有點思路,這學期才開始資料結構的學習。在區域性有序中進行查詢,同樣是可以用二分查詢法的。為了問題的簡化,不妨先假設n=m,那麼這個矩陣就是n階方陣。從主對角線上的元素開始進行二分查詢,考慮最壞情況耗時為:log(n)。然後對左下角和右上角的兩個n/2階方陣分別又從主對角線上的元素開始進行二分查詢,重複步驟到最後。每一次把矩陣分為了1,2,4,8,2^i個,運用了遞迴的思想。故時間複雜度應為:t(n)=1*log(n/1)+2log(n/2)+4log(n/4)+2^(i)log(n/2^(i))+…+;觀察前幾項可以把c,d選項直接排除。對這個級數求和大致可以得到o(2n),從而選項b:o(n+m)是正確的。(其實大o表示法在這裡不是嚴密的,我們也可以選a,因為由大o的定義o(m*n)包含了o(m+n),雖然這並不符合題意)

分類

//陣列data,0到length-1都存有資料

for(i=0;iif(key==data[i]) return i;

return

0;

//陣列data,1到length中存有資料

for(i=length;i>0&&key!=data[i];i--);

return i;

//設定哨兵,有唯一出口和單個判斷條件

data[0]=key;

for(i=length;key!=data[i];i--);

return i;

2:二分查詢

假設樹的深度depth是從1開始的,則查詢判定樹的depth=⌊l

ogn⌋

or ⌈l

ogn⌉

+1asl:成功查詢每個元素所需要的平均判定次數

//注意data陣列中的資料是從1開始存放的

left=1;

right=length;

notfind=-1;

while(left1)//left<=right,最好不要帶有「=」號

{ mid=(left+right)/2;

if(data[mid]1;

else

if(data[mid]>key) right=mid-1;

else

return mid;

}return notfind;

//在這個**段中如果每次更新left和right用的不是mid+1和mid+1,則當查詢的元素不再有序的序列中,就會進入死迴圈。**注意!在其他程式中的判定條件和更新邊界的方法是不同,但是二分的思想是相同的,自己可以寫出正確的**來**

3.**分割查詢

#include 

//_crtimp double __cdecl ceil (double);向上取整(天花板)

//_crtimp double __cdecl floor (double);向下取整(地板)

#define cut 0.618

left=1;

right=length;

notfind=-1;

while(left1)

return notfind;

資料管理的基本操作 查詢

二分查詢判定樹 updata 查詢 searching 根據某個給定關鍵字k 從集合r中找出關鍵字與k相同的記錄 靜態查詢 集合中記錄是固定的 沒有插入和刪除操作,只有查詢 動態查詢 集合中記錄是動態變化的 除查詢,還可能發生插入和刪除 順序查詢演算法的時間複雜度為o n int sequentia...

mongDB 基本查詢操作

最近一直在用mongodb,有時候會需要用到統計,在網上查了一些資料,最適合用的就是用aggregate,以下介紹一下自己運用的心得。pro ject 包含 排除 重 命名和顯 示欄位 pro ject 包含 排除 重 命名和顯 示字 段match 查詢,需要同find 一樣的引數 li mit 限...

5 基本查詢操作

我這些學習筆記,記錄的都是我自己認為的知識點,可能以後再看的時候還要翻書,但是可以用來定位到準確的書中示例的位置,減少翻書重找的時間,利於自身知識體系的搭建。self transcendence 第5章 基本查詢操作 5.1 查詢全部列的記錄 select distinct from 表名,檢視名 ...