查詢與排序01,線性查詢,時間複雜度,演算法

2022-01-19 02:13:28 字數 2406 閱讀 5751

線性查詢,肯定是以線性的方式,在集合或陣列中查詢某個元素。本篇包括:

通過**來理解線性查詢

什麼叫"線性"?還是在**中體會吧。

首先需要乙個集合或陣列,如何得到呢?就生成乙個固定長度的隨機數組吧。然後輸入乙個查詢key,如果找到就返回元素的索引,沒找到就返回-1,就這麼簡單。

class program
所在的位置是", temp, linearsearch(temp));
console.readkey();
}
//線性查詢
private

static

int linearsearch(int key)

return -1;//如果沒找到就返回-1
}
//陣列的種子資料
private

static

void seeddata(int size)

}
//列印陣列的所有元素
private

static

void showarray()

}
}

以上,我們自己可以定義什麼叫"線性查詢"了。就是說,當我們輸入乙個查詢的key,是按順序依次查詢集合中的每個元素(實際是通過迴圈遍歷),如果找不到就返回乙個值,比如-1,如果找到就返回該元素的索引位置。

時間複雜度

線性查詢只是查詢的一種最簡單的演算法,還有其它相對複雜的演算法。如何來衡量各種演算法的效率呢,答案是用"時間複雜度"來衡量的。任何的概念**於實踐,並不是憑空產生的,"時間複雜度"也一樣。

□ o(1)

假設乙個陣列中有10個元素,需要比較第乙個元素是否等於第二個元素,演算法只需要執行一次就可以得出結果。如果陣列中有100個元素呢?演算法還是執行一次就得到結果。於是,人們就想:演算法的執行和陣列大小沒有關係,就把這種演算法叫做"常量執行時間"吧。但還不夠直觀,用什麼圖形表示呢?人們想出就用o(1)來表示吧。

o(1)雖然很直觀,但很容易產生歧義。有些人認為:只有演算法執行一次,並且執行的次數不隨陣列大小改變,就可以用o(1)表示了。這是很明顯的"望文生義"。o(1)更準確的解釋是:演算法的執行次數是乙個常量,不會隨著陣列大小而改變。

□ o(n)

生活的精彩來自多樣性。假設乙個陣列中還是10個元素,需要比較第乙個元素是否等於陣列中任何其它元素,演算法需要執行9次。如果陣列中有100個元素呢,演算法需要執行99次,也就是n-1次,演算法執行的次數隨著n的不同而發生改變。人們把這種演算法寫成o(n),1可以忽略不計,讀成"n階"。

□ o(n²)

假設還有一種演算法,需要比較陣列中的任何元素於其它元素是否相等。第乙個元素,需要和後面n-1個元素比較,第二個元素需要和除了第乙個元素之外的其後面n-2個元素比較......也就是:(n-1) + (n-2) + ... + 2 + 1,這個公式用筆在紙上簡單推算一下,還可以提煉為n²/2-n/2,隨著n的增大,常量因子可以忽略,寫成o(n²),稱為"平方執行時間",讀成"n²階"。

當n是幾萬,o(n²)演算法在今天每秒執行幾十億次的個人計算機上,不會有明顯的效能影響。但如果n變成幾百萬,就要求幾萬億次計算,這樣可能要幾個小時來執行。更有甚者,如果n變成幾十億,計算需要幾十年來完成。所以,每種演算法都有它的適用範圍。

現在,可以稍微完整地定義"時間複雜度"了,它是乙個函式,定量描述了演算法的執行時間。時間複雜度是在最壞情況下的時間複雜度。

常見的時間複雜度有:

● o(1), 常數階,比如hash表的查詢

● o(log2n),對數階,比如二分查詢

● o(n),線性階

● o(nlog2n),線性對數階,比如快速排序的平均複雜度

● o(n^2),平方階,比如氣泡排序

● o(n^3),立方階,比如求最短路徑的floyd演算法

● o(n^k),k次方階

● o(2^n),指數階,比如漢諾塔

什麼是演算法

是解決特定問題求解步驟的描述。在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作。

sum = 1     +     2     +     3 + ... + 100
sum = 100   +     99  +   98+ ... + 1
2*sum = 101*100 = 10100
sum = 5050

以上就是針對1到100求和的演算法。對,是在18世紀,乙個德國的小村莊,乙個叫高斯的小孩想出來的,就這麼神奇!

「查詢與排序」系列包括:

mysql 查詢時間轉換 Mysql 查詢時間轉換

利用data format函式 select date format now y m d 根據format字串格式化date值 s,s 兩位數字形式的秒 00,01,59 i,i 兩位數字形式的分 00,01,59 h 兩位數字形式的小時,24 小時 00,01,23 h 兩位數字形式的小時,12 ...

linux查詢時間

一 檢視和修改linux的時區 檢視當前時區 命令 date r 修改設定linux伺服器時區 方法 a 命令 tzselect 方法 b 僅限於redhat linux 和 centos 命令 timeconfig 方法 c 適用於debian 命令 dpkg reconfigure tzdata...

優化查詢 節省查詢時間

優化查詢 select from emp2 1 不要使用 select 用具體的字段來代表 不要返回用不到的字段。select ename,sal from emp2 where ename scott select ename,sal from emp2 where ename scott 2 盡...