我具有使用自己创建的方法通过在线测试的条件。我感觉其中一项测试存在问题。最后一个我无法通过。这是测试-
TEST_CASE ("Linear Search With Self-Organization 3") {
int searchKey = 191;
vector<int> searchArray(500);
for (int i = 0; i < 500; i++) {
searchArray[i] = i + 1;
}
random_shuffle(searchArray.begin(), searchArray.end());
bool result, result2;
result = linearSearchSO(searchArray, searchKey);
int searchKey2 = 243;
result2 = linearSearchSO(searchArray, searchKey2);
REQUIRE (result == true);
REQUIRE (result2 == true);
REQUIRE (verifySearchArray(searchArray) == true);
REQUIRE (searchArray[0] == searchKey2);
REQUIRE (searchArray[1] == searchKey);
REQUIRE (searchArray.size() == 500);
}
这里讨论的方法是linearSearchSO。
bool linearSearchSO(vector<int> & inputArr, int searchKey) {
printArray(inputArr);
for(int i=0; i < inputArr.size(); i++) {
int temp = inputArr[0];
if (inputArr[i] == searchKey) {
inputArr[0] = inputArr[i];
inputArr[i] = temp;
printArray(inputArr);
return true;
}
}
return false;
}
值得一提的是,此方法已通过所有其他3个所需的测试。如您在测试中所见,我的老师两次调用此方法,并传递两个不同的值。这个想法是有一个500个数字的向量。在这种情况下,他将数字随机化。对我来说,最好的解释方式是,如果他不进行随机选择,而数字只是列出1-500。该方法被调用,我从请求的数字191开始,将其移到向量的前面。现在读取191、2、3、4等190、1、192等因此,他然后再次调用该方法,并希望将243移到最前面。他的测试希望结果为243、191、2、3、4。但是我的代码所做的是将191换到243的位置。我的结果现在显示为243、2、3、4等。242、191、244、245等。
[其他测试只是将一个数字移到最前面,然后检查每个数字是否位于正确的位置。我的问题是,有没有办法让我达到243、191、2、3 ..而不会弄乱我仅使用此linearSearch函数通过的所有其他测试?还是测试有问题,他只是犯了一个错误。
编辑-实际问题要求进行此测试。问题4自组织搜索算法是一种重新排列集合中的项目的算法,以便经常在搜索中找到那些经常搜索的项目。修改用于线性搜索的学习算法,以便每次在数组中找到一个项目时,该项目就会与数组开头的项目交换。
如果我已正确理解,则需要类似以下内容的东西>>
#include <iostream> #include <vector> bool linearSearchSO( std::vector<int> & inputArr, int searchKey ) { bool success = false; auto it = inputArr.begin(); while ( it != inputArr.end() && *it != searchKey ) ++it; if ( ( success = it != inputArr.end() ) ) { int value = *it; inputArr.erase( it ); inputArr.insert( inputArr.begin(), value ); } return success; } int main() { std::vector<int> inputArr = { 1, 2, 3, 4, 5 }; for ( const auto &item : inputArr ) { std::cout << item << ' '; } std::cout << '\n'; linearSearchSO( inputArr, 3 ); for ( const auto &item : inputArr ) { std::cout << item << ' '; } std::cout << '\n'; }
程序输出为
1 2 3 4 5 3 1 2 4 5
请注意,您可以使用标准算法
std::find
,而不是在函数中手动编写循环。