该程序在字典文本文件中搜索用户输入的单词并输出它所在的行。我需要计算在线性和二进制搜索中找到该单词的比较次数。现在它说没有进行零比较。关于在何处或如何实施这些计数器的任何想法都将非常感激。
string linearSearch(const vector<string> &L, string k);
string binarySearch(const vector<string> &L, string k, int a = 0, int b = -1);
int count1 = 0;
int count2 = 0;
int main()
{
ifstream inFile;
inFile.open("dictionary.txt");
vector < string > words;
string line;
while (getline(inFile, line))
{
words.push_back(line);
}
inFile.close();
string userWord;
cout << "Search for a word: " << endl;
cin >> userWord;
if (words.empty())
{
return -1;
}
cout << "Using binary search, the word " << userWord << " is in slot "
<< binarySearch(words, userWord) << ". There were " << count2
<< " comparisons made." << endl;
cout << "Using linear search, the word " << userWord << " is in slot "
<< linearSearch(words, userWord) << ". There were " << count1
<< " comparisons made." << endl;
return 0;
}
string linearSearch(const vector<string> &L, string k)
{
for (int i = 0; i < L.size(); ++i)
{
count1++;
if (L[i] == k)
{
count1++;
return to_string(i);
}
}
return to_string(-1);
}
string binarySearch(const vector<string> &L, string k, int a, int b)
{
++count2;
if (b == -1)
{
b = L.size();
}
int n = b - a;
if (n == 0)
{
return to_string(-1); //?
}
int mid = (a + b) / 2;
if (L[mid] == k)
{
++count2;
return to_string(mid);
}
else if (L[mid] > k)
{
++count2;
return binarySearch(L, k, a, mid);
}
else
{
count2 += 2;
return binarySearch(L, k, mid + 1, b);
}
return to_string(-1);
}
答案 0 :(得分:1)
哦,这看起来像序列点引起的未定义行为(有关详细信息,请参阅this question)。
引用该问题的答案,
单个运算符的操作数和各个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定的。
您正尝试在同一序列点中执行一个集合并获取相同的变量(其中一个计数)。首先会发生这种情况(设置或获取)是未定义的。
将你的cout分成两部分,一切都应该解决。
cout << "Using binary search, the word "<< userWord << " is in slot " <<
binarySearch(words,userWord) << ".";
cout << "There were " << count2 << " comparisons made." << endl;
cout << "Using linear search, the word "<< userWord << " is in slot " <<
linearSearch(words,userWord) << ".";
cout << "There were " << count1 << " comparisons made." << endl;