C#實現(xiàn)線性查找算法
線性查找,肯定是以線性的方式,在集合或數(shù)組中查找某個元素。
通過代碼來理解線性查找
什么叫"線性"?還是在代碼中體會吧。
首先需要一個集合或數(shù)組,如何得到呢?就生成一個固定長度的隨機(jī)數(shù)組吧。然后輸入一個查找key,如果找到就返回元素的索引,沒找到就返回-1,就這么簡單。
class Program { private static int[] arr; private static Random r = new Random(); static void Main(string[] args) { SeedData(10); ShowArray(); Console.WriteLine("\n"); Console.WriteLine("請輸入要查找的整型數(shù)"); var temp = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("您要查找的{0}所在的位置是{1}", temp, LinearSearch(temp)); Console.ReadKey(); } //線性查找 private static int LinearSearch(int key) { for (int i = 0; i < arr.Length; i++) { if (arr[i] == key) return i; //找到就返回索引 } return -1;//如果沒找到就返回-1 } //數(shù)組的種子數(shù)據(jù) private static void SeedData(int size) { arr = new int[size]; for (int i = 0; i < size; i++) { arr[i] = r.Next(1, 100); } } //打印數(shù)組的所有元素 private static void ShowArray() { foreach (var item in arr) { Console.Write(item + " "); } } }
以上,我們自己可以定義什么叫"線性查找"了。就是說,當(dāng)我們輸入一個查找的key,是按順序依次查找集合中的每個元素(實際是通過循環(huán)遍歷),如果找不到就返回一個值,比如-1,如果找到就返回該元素的索引位置。
時間復(fù)雜度
線性查找只是查找的一種最簡單的算法,還有其它相對復(fù)雜的算法。如何來衡量各種算法的效率呢,答案是用"時間復(fù)雜度"來衡量的。任何的概念來源于實踐,并不是憑空產(chǎn)生的,"時間復(fù)雜度"也一樣。
O(1)
假設(shè)一個數(shù)組中有10個元素,需要比較第一個元素是否等于第二個元素,算法只需要運行一次就可以得出結(jié)果。如果數(shù)組中有100個元素呢?算法還是運行一次就得到結(jié)果。于是,人們就想:算法的運行和數(shù)組大小沒有關(guān)系,就把這種算法叫做"常量運行時間"吧。但還不夠直觀,用什么圖形表示呢?人們想出就用O(1)來表示吧。
O(1)雖然很直觀,但很容易產(chǎn)生歧義。有些人認(rèn)為:只有算法運行一次,并且運行的次數(shù)不隨數(shù)組大小改變,就可以用O(1)表示了。這是很明顯的"望文生義"。O(1)更準(zhǔn)確的解釋是:算法的運行次數(shù)是一個常量,不會隨著數(shù)組大小而改變。
O(n)
生活的精彩來自多樣性。假設(shè)一個數(shù)組中還是10個元素,需要比較第一個元素是否等于數(shù)組中任何其它元素,算法需要運行9次。如果數(shù)組中有100個元素呢,算法需要運行99次,也就是n-1次,算法運行的次數(shù)隨著n的不同而發(fā)生改變。人們把這種算法寫成O(n),1可以忽略不計,讀成"n階"。
O(n²)
假設(shè)還有一種算法,需要比較數(shù)組中的任何元素于其它元素是否相等。第一個元素,需要和后面n-1個元素比較,第二個元素需要和除了第一個元素之外的其后面n-2個元素比較......也就是:(n-1) + (n-2) + ... + 2 + 1,這個公式用筆在紙上簡單推算一下,還可以提煉為n²/2-n/2,隨著n的增大,常量因子可以忽略,寫成O(n²),稱為"平方運行時間",讀成"n²階"。
當(dāng)n是幾萬,O(n²)算法在今天每秒運行幾十億次的個人計算機(jī)上,不會有明顯的性能影響。但如果n變成幾百萬,就要求幾萬億次計算,這樣可能要幾個小時來執(zhí)行。更有甚者,如果n變成幾十億,計算需要幾十年來完成。所以,每種算法都有它的適用范圍。
現(xiàn)在,可以稍微完整地定義"時間復(fù)雜度"了,它是一個函數(shù),定量描述了算法的運行時間。時間復(fù)雜度是在最壞情況下的時間復(fù)雜度。
常見的時間復(fù)雜度有:
- O(1), 常數(shù)階,比如Hash表的查找
- O(log2n),對數(shù)階,比如二分查找
- O(n),線性階
- O(nlog2n),線性對數(shù)階,比如快速排序的平均復(fù)雜度
- O(n^2),平方階,比如冒泡排序
- O(n^3),立方階,比如求最短路徑的Floyd算法
- O(n^k),k次方階
- O(2^n),指數(shù)階,比如漢諾塔
什么是算法
是解決特定問題求解步驟的描述。在計算機(jī)中表現(xiàn)為指令的有限序列,并且每條指令表示一個或多個操作。
sum = 1 + 2 + 3 + ... + 100 sum = 100 + 99 + 98+ ... + 1 2*sum = 101*100 = 10100 sum = 5050
以上就是針對1到100求和的算法。對,是在18世紀(jì),一個德國的小村莊,一個叫高斯的小孩想出來的,就這么神奇!
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
C#中泛型容器Stack<T>的用法并實現(xiàn)”撤銷/重做”功能
這篇文章介紹了C#中泛型容器Stack<T>的用法并實現(xiàn)”撤銷/重做”功能,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-10-10c# WPF中自定義加載時實現(xiàn)帶動畫效果的Form和FormItem
這篇文章主要介紹了c# WPF中自定義加載時實現(xiàn)帶動畫效果的Form和FormItem,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03C#通過正則表達(dá)式實現(xiàn)提取網(wǎng)頁中的圖片
本文給大家分享的是使用C#通過正則表達(dá)式來實現(xiàn)提取網(wǎng)頁中的圖片的代碼,十分的方便,有需要的小伙伴可以參考下。2015-12-12