轉帖|其它|編輯:郝浩|2011-08-01 17:55:28.000|閱讀 2793 次
概述:利用List或者數組存儲數據,希望以此改善你的程序,可以對List或者數組的BinarySearch方法進行評估。如果是一個可變數量的元素集合,Binary搜索是針對集合中的值進行排序的一種“令人吃驚的”算法,其算法復雜度為O(log n),與C#中其它排序方法相比,它具備更高的效率。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
利用List或者數組存儲數據,希望以此改善你的程序,可以對List或者數組的BinarySearch方法進行評估。如果是一個可變數量的元素集合,Binary搜索是針對集合中的值進行排序的一種“令人吃驚的”算法,其算法復雜度為O(log n),與C#中其它排序方法相比,它具備更高的效率。
示例:
下面是一個對List類型使用BinarySearch方法的示例。你必須為List中所使用的類型提供一個值,這樣該方法才能通過編譯。程序中通常使用字符串,這里也就使用string類型。
BinarySearch方法示例代碼:
1 using System; 2 using System.Collections.Generic; 3 4 class Program 5 { 6 static void Main() 7 { 8 List<string> l = new List<string>(); 9 l.Add("acorn"); // 0 10 l.Add("apple"); // 1 11 l.Add("banana"); // 2 12 l.Add("cantaloupe"); // 3 13 l.Add("lettuce"); // 4 14 l.Add("onion"); // 5 15 l.Add("peach"); // 6 16 l.Add("pepper"); // 7 17 l.Add("squash"); // 8 18 l.Add("tangerine"); // 9 19 20 // This returns the index of "peach". 21 int i = l.BinarySearch("peach"); 22 Console.WriteLine(i); 23 24 // This returns the index of "banana". 25 i = l.BinarySearch("banana"); 26 Console.WriteLine(i); 27 28 // This returns the index of "apple". 29 i = l.BinarySearch("apple"); 30 Console.WriteLine(i); 31 32 Console.ReadKey(); 33 } 34 }
輸出:
6 2 1
描述。上述程序從List中找出了“peach”、“banana”,和“apple”這三個字符串的位置的值。注意List中的項是按照字母順序排列的。如果List或者數組沒有經過排序,使用BinarySearch方法將會得不到正確結果。至于是按照數值大小、字母順序,或者ASCII來排序,都是可以的。
比較基準
在針對一個較大的集合進行搜索時,binary搜索比linear搜索的效率要高很多,對于元素個數小于100的集合,BinarySearch較慢,可能是執行時的資源消耗導致的。
理解BinarySearch
我們注意到Wikipedia對binary搜索的陳述:“makes progressively better guesses, and closes in on the location of the sought value by selecting the middle element in the pan.”參見Wikipedia的文章“Binary Search Algorithm”。MSDN對List的BinarySearch方法作了如下陳述:“返回元素基于0的索引值”。然而,必須使用一個排序過的List。
字典是什么?
這里我們提到字典是恒定的查找時間哈希表。對于我所用到的數據,不管List采用哪種排序算法都沒有字典高效快速。一個顯然的情況是,你必須為大多數的方案挑選字典。參見上述比較基準,隨著集合元素的增加,BinarySearch方法比linear搜索更高效。
對于非常較大的集合,比如有著上百萬的元素,建立起一個字典將會消耗掉由查找操作所節省下來的時間。然而,我發現這種情況并不常見。
總結
這篇文章講述了在什么樣的情況下可以使用List類型的BinarySearch方法。針對大集合,BinarySearch使用了一個比迭代 搜索更好的算法,但是對于小集合,其效率又通常低于字典。我建議你在每一次考慮BinarySearch方法時做一個性能監測。你可以從Array.BinarySearch方法這篇文章中了解.NET Framework內部的Array.BinarySearch的信息。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載