向量上的线性搜索
Linear Search on Vector
我要使用创建的方法在线通过测试。我觉得其中一项测试有问题。最后一个我不能通过。这是测试-
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移到前面。他的测试结果是243191,2,3,4。然而,我的代码所做的是交换191到243的位置。我的结果现在是243、2、3、4等242、191、244、245等
每隔一次测试只需取一个数字并将其移到前面,然后测试就会检查每个数字是否处于正确的位置。我的问题是,有没有一种方法可以让我只使用这一个linearSearch函数就可以实现2431912,3..而不会打乱我通过的其他所有测试?或者是考试出了问题,他只是犯了一个错误。
编辑-本次测试的实际问题。问题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
,而不是在函数中手动编写循环。
相关文章:
- 向量上的线性搜索
- 二叉搜索如何比线性搜索更快?
- C++(线性搜索和排序)
- C++线性搜索算法,确定数组中元素的数量
- 如何在 c++ 中线性搜索两个数组?
- 有没有办法搜索向量的元素,<String>然后检查它是否包含特定的字符,如果它确实打印了它
- 变量未在此范围内声明 数组线性搜索
- 如何在 c++ 中对两个向量进行线性搜索?
- 用户输入字符串的结构的搜索向量
- 线性搜索 MPI(在其他进程中停止)
- SIMD 线性搜索比展开循环慢
- 是否可以显示需要线性搜索的时间才能找到您在程序中找到的密钥
- 如何在C 中解决线性搜索问题
- 这是哨兵线性搜索的错误方法吗?
- 数组中的线性搜索返回意外结果
- 在不进行线性搜索的情况下,在非常大的数组中找到比给定数字更小的数字
- 搜索向量时出错
- 如何在 c++ 中搜索向量并获取元素的位置
- 关于修复对向量的线性搜索函数的调用的建议
- 线性搜索向量[i]的响应时间为0ms,而向量.at(i)的响应时间为0ms