C++:字符串的二进制搜索部分
Posted
技术标签:
【中文标题】C++:字符串的二进制搜索部分【英文标题】:C++: Binary Search Part of a String 【发布时间】:2014-04-21 17:46:39 【问题描述】:我现在正在进行作业的第 4 部分,我正在尝试找出如何仅从字符串数组中的前 14 个字符进行二进制搜索。我们得到了两个 .csv 文件:
01110011100110 是模拟条码。
Inventory.csv:以逗号分隔的库存商品 - 条形码、产品、价格 前五行:
01001010100011,Air freshener,12.43
01101000111101,Alfredo sauce,10.71
10000010100101,All spice,4.14
00011011001111,Allergy medication,20.06
00101010111011,Aluminum foil,8.92
Carts.csv:包含购买条形码的“购物车” 前五行:
01000011010100,00010011010100
00110111100000
00100110100000,01011000110111,01011101000110,01011101000000,01001110000010
01110101100101,00100111110101,00101101110110,00100110000000,00100000001100,00101101011100
00101100111110,01000110110000,01010110111110,00100111111001,01011101101010,01011011010011,00010011010100,01010111101001
我正在做作业的第 4 部分: 第 4 部分:编写一个函数以读取 Carts.csv 文件。一次读一行并处理它。工艺步骤如下: 一种。根据逗号分隔符分隔每个购物车中的条形码。 湾。对于每个条码,在产品列表中查找条码。 C。从产品字符串数据行中提取价格并将其添加到购物车的运行总计中。 d。处理完该行后,输出购物车的总价。 e.从步骤 (a) 重复直到文件结束。
当我尝试查找它返回 -1 时,它是在比较整行而不是它的一部分。如何二进制搜索只是字符串的一部分。这是我的代码的摘录:
int binarySearch(string* list, int size, string value)
int first = 0,
last = size - 1, middle,
position = -1;
bool found = false;
while (!found && first <= last)
middle = (first + last) / 2;
if (list[middle].compare(value) == 0)
found = true;
position = middle;
else if (list[middle].compare(value) > 0)
last = middle - 1;
else
first = middle + 1;
return position;
void processFile(string filename, string* list, int size)
ifstream file(filename);
string line;
int count = 1;
if (file.is_open())
while (!file.eof())
int ctr = 0;
int start = 0;
getline(file, line);
string substring = "";
int find = line.find(COMMA);
cout << "Cart " << count << ": ";
while (find != string::npos)
substring = line.substr(start, find - start);
int position = binarySearch(list, size, substring);
cout << position << " ";
start = find + 1;
ctr++;
find = line.find(COMMA, start);
if (ctr > 0 || find == -1)
substring = line.substr(start, line.length() - start);
int position = binarySearch(list, size, substring);
cout << position << endl;
count++;
file.close();
【问题讨论】:
始终使用您正在使用的编程语言进行标记。它将获得更多视图并获得语法着色。 哦,我忘了。谢谢。 您可以使用memcmp()
逐字节比较任何内存块。
比较方法与您在下面已经完成的类似。您可以使用list[middle].find(value) != 0
代替相机。虽然总的来说,我认为您最好将这些行实际解析为结构并使用二进制字符串作为 std::map 中的键
感谢所有 cmets。非常感谢。
【参考方案1】:
试试下面的功能实现
int binarySearch( const std::string* list, int size, std::string value )
int position = -1;
int first = 0, last = size - 1;
while ( first <= last )
int middle = ( first + last ) / 2;
int result = list[middle].substr( 0, value.size() ).compare( value );
if ( result == 0 )
position = middle;
break;
else if ( result > 0 )
last = middle - 1;
else
first = middle + 1;
return position;
当然数组列表必须按照条形码升序排列。
【讨论】:
以上是关于C++:字符串的二进制搜索部分的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++ 中搜索 std::string 中的子字符串?
用于十六进制的 c/c++ 中的 Aho-Corasick 算法