查找與排序01,線性查找,時間復雜度,算法


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

 

 

  通過代碼來理解線性查找

什么叫"線性"?還是在代碼中體會吧。

 

首先需要一個集合或數組,如何得到呢?就生成一個固定長度的隨機數組吧。然后輸入一個查找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("請輸入要查找的整型數");
            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
        }
        //數組的種子數據
        private static void SeedData(int size)
        {
            arr = new int[size];
            for (int i = 0; i < size; i++)
            {
                arr[i] = r.Next(1, 100);
            }
        }
        //打印數組的所有元素
        private static void ShowArray()
        {
            foreach (var item in arr)
            {
                Console.Write(item + " ");
            }
        }
    }   

以上,我們自己可以定義什么叫"線性查找"了。就是說,當我們輸入一個查找的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世紀,一個德國的小村庄,一個叫高斯的小孩想出來的,就這么神奇!

 

“查找與排序”系列包括:

查找與排序01,線性查找,時間復雜度,算法

查找與排序02,折半查找

查找與排序03,選擇排序

查找與排序04,插入排序

查找與排序05,冒泡排序


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM