2016-09-19 18 views
-2

我有List和它的值是(「Brandenburg」,「Alabama」和「Alberta」)。當我使用BinarySearch("Brandenburg")方法時,它返回-4而不是0,但是當對這個列表進行排序時,我可以得到正確的索引。爲什麼如果我使用未排序列表,它會返回錯誤的值?我也從IndexOf("Brandenburg")方法得到正確的索引。哪種方法是有用的,我可以使用?需要了解BinarySearch和IndexOf方法的行爲

由於事先 Prithivi

+0

通常二進制搜索在排序列表/數組上工作。但是你也可以修改你的列表是否遵循特定的模式。但在完全隨機的情況下。binarySearch將不起作用 – sinsuren

+2

因此,您仔細閱讀了兩種方法的文檔...請澄清那裏確切的不清楚。 –

+1

如果你看二進制搜索的定義,你會發現二分搜索是一種搜索算法,它可以在排序的數組中找到目標值的位置。所以它只適用於排序的數組。 for IndexOf,看看這裏https://msdn.microsoft.com/en-us/library/k8b1470s(v=vs.110).aspx –

回答

1

它必須進行排序,使用二進制搜索。你得到的原因是-4是;

您的集合未進行排序,對於二進制搜索,列表將在每次迭代中「減半」。所以:

當它啓動時,topIndex == 0和底= 2

TopIndex -> (0) "Brandenburg", 
       (1) "Alabama" 
BottomIndex -> (2) "Alberta 

在進行二分查找將檢查中間的項目:(2-0)/ 2 = 1,如果你是搜索Brandenburg。它將比較Alabama與您的搜索項目。字母B比'A'字母'大'。所以它將topIndex移動到索引1.

   (0) "Brandenburg", 
TopIndex -> (1) "Alabama" 
BottomIndex -> (2) "Alberta 

然後它會比較下一個'中間'項目。在這種情況下,再次Alabama(2-1)/2 = 1。它也將與bottomIndex比較,但這是最後一個。

當binarysearch返回負數時,表示無法找到該項目。負數是它應該插入的索引。(-result -1)所以,如果你想添加新的項目,它應該被插入索引(--4 -1) == 3

0

讓我解釋二進制搜索的工作原理。

說你有這個數組:

{1, 3, 5, 7, 10, 15, 20} 

而且我想找到的15.什麼二進制搜索要做的是,它看起來在陣列中間的指數,7是7大或小比15?如果小於15,則在陣列的後半部分再次執行相同的操作(10,15,20)。如果它大於15,則在前半部分進行(1,3,5)。如果它等於15,那麼意味着15被找到。

這意味着數組必須進行排序才能進行二進制搜索。這就解釋了爲什麼在數組上執行二分搜索會返回一個負數。因爲顯然,該方法找不到使用二分搜索算法請求的字符串。

您可以通過IndexOf獲得正確的索引。這是因爲IndexOf使用線性搜索來查找該項目。它會查看數組中的每個元素並將其與您正在查找的元素進行比較。因此,數組是否被排序並不重要。

注意:我還沒有讀取IndexOf的源代碼。如果它發現數組已排序,它可能會使用二進制搜索。這只是我的猜測。