我目前有一些代码,我希望添加二进制搜索。目前,我的代码读取文件并使用内置函数搜索值。有没有什么方法可以轻松实现二进制搜索。我有二进制搜索的代码,但我真的不明白它。我理解它的原理但不确定应用。任何帮助将不胜感激。
当前代码:
string fileResponse = "Data1/Region_1.txt";
Console.Write("please enter a word to search for in the file: (Case Sensitive) ");
string wordResponse = Console.ReadLine();
StreamReader myfile = File.OpenText(fileResponse);
using (StreamReader myFile = File.OpenText(fileResponse))
{
int count = 0; //counts the number of times wordResponse is found.
int lineNumber = 0;
while (!myFile.EndOfStream)
{
string line = myFile.ReadLine();
lineNumber++;
int position = line.IndexOf(wordResponse);
if (position != -1)
{
count++;
Console.WriteLine("Match #{0} {1}:{2}", count, lineNumber, line);
}
}
if (count == 0)
{
Console.WriteLine("your word was not found!");
}
else
{
Console.WriteLine("Your word was found " + count + " times!");
}
Console.ReadLine();
}
标准二进制搜索我想实现:
public static object BinarySearchIterative(int[] inputArray, int key, int min, int max)
{
while (min <=max)
{
int mid = (min + max) / 2;
if (key == inputArray[mid])
{
return ++mid;
}
else if (key < inputArray[mid])
{
max = mid - 1;
}
else
{
min = mid + 1;
}
}
return "0";
}
答案 0 :(得分:0)
我认为你要找的答案是“不。”
二进制搜索只能在您排序的字段上进行。让我举个例子:
...这些记录按名字排序。所以让我们做一个简单的二元搜索,找到名字'Millard'。从中途开始,阅读'John'。米勒德比那更大,所以名字必须在下半部分。接下来,看看下半部分 - 让我们说它是托马斯杰斐逊。等等,不,太远 - 米勒德介于两者之间。在'John'和'Thomas'之间阅读,你会发现Millard。恭喜!您无需阅读整个文件 - 您可以向上/向下反弹以找到您正在寻找的内容。
但是现在想象你已经被赋予了一个不同的任务:找到一个名字在其中的'ob' 的总统。所以你尝试二进制搜索,然后你读'约翰'。呃......你走哪条路?向上?下?你不能二元搜索,因为你无法判断是向上还是向下跳过。
短篇小说是:你只能在字段上进行二进制搜索,即数据的排序(即使这样,你也只能从字段的开头进行二进制搜索。)
因此,当您要求在文件中搜索单词时,听起来您正在文件中的任何地方中查找单词 - 而不仅仅是已排序的列。在这种情况下,你真的不能使用二进制搜索。