对数组的一部分进行对象搜索
Object search on part of the array
我有这样的对象:
class search_object
{
public:
unsigned int index; // 0 <= index <= 50000
unsigned int search_field; // 1 <= search_field <= 5000000000, can be duplicates!
};
我有大约50000
这样类型的对象。这些对象按索引排序。
我的程序得到这样的搜索查询:"有没有一些对象,其索引在left_index
和right_index
(left_index <= index <= right_index
)之间,并且search_field
等于Number
(search_field == Number
)。"
大约有50000
查询。
我有解决方案,但它对我的上下文系统来说很慢。
我的算法是:
- 按
search_field
对搜索对象进行排序 - 查找
lower_index
,其中search_object[lower_index] = Number
(lower_bound()
函数,它是二进制搜索) - 在对象数组上从
lower_index
迭代到数组的末尾。如果this_object
在left_index
和right_index
之间具有index
,则true
。否则,false
- 对所有搜索查询(left_index、right_index和Number)重复步骤
2-3
我会使用标准容器,我不会将对象本身用作键。代码示例:
std::map<decltype(search_object::index), search_object> container;
...
auto itr = container.lower_bound(left_index);
while (itr != container.end() && itr->first <= right_index)
if (itr->second == Number) return itr;
return container.end();
您可以使用map<unsigned int, list<search_object*>>
,它为每个search_field保存对象列表。
在搜索之前使用正确的排序策略可以轻松完成。
#include <iostream> // std::cout
#include <algorithm> // std::lower_bound, std::upper_bound, std::sort
#include <vector> // std::vector
class search_object
{
public:
uint64_t index; // 0 <= index <= 50000
uint64_t search_field; // 1 <= search_field <= 5000000000, can be duplicates!
};
search_object data[] = { { 13, 54345632 }, { 42, 4645347 }, { 63, 4645347 }, { 117, 4674534536 } };
using table = std::vector<search_object>;
using itr = table::const_iterator;
using range = std::pair<itr, itr>;
template<typename Pred>
range FindRange(const table& vec, Pred pred, search_object lowValue, search_object highValue) {
// concept vec is sorted by pred
//assert(pred(lowValue, highValue)); // paranoid check
itr low=std::lower_bound (vec.begin(), vec.end(), lowValue, pred); //
itr up= std::upper_bound (low, vec.end(), highValue, pred); // no reason to search before low!
return range(low, up);
}
int main () {
std::vector<search_object> FldTable(std::begin(data),std::end(data));
// sort by primary key field and secondary index.
auto CmpFld = [] (const search_object& obj1, const search_object& obj2) {
return obj1.search_field < obj2.search_field || // primary sort
((obj1.search_field == obj2.search_field) && // secondary
(obj1.index < obj2.index)
);
};
// sort after field
std::sort (FldTable.begin(), FldTable.end(), CmpFld); // dublicates possible.
// some "random" search values
unsigned int lowSearchIndex = 10, highSearchIndex = 100, searchField = 4645347;
search_object low { lowSearchIndex, searchField };
search_object up { highSearchIndex, searchField };
range search = FindRange(FldTable, CmpFld, low, up);
for (itr record = search.first; record < search.second; ++record)
std::cout << "index = " << record->index << " field = " << record-> search_field << "n";
return 0;
}
输出
index = 42 field = 4645347
index = 63 field = 4645347
std::upper_bound返回一个迭代器,该迭代器指向范围[first,last)中的第一个元素,该元素的比较值大于值。
相关文章:
- 在对象数组中搜索字符串并返回相应值的函数
- 在C++代码中搜索对象的实例化位置
- 使用二进制搜索树中的迭代器对象访问左侧节点
- 在 c++ 上搜索结构中的对象
- 如何使用 stl 容器有效地存储对象?(即根据其字段的值进行搜索)
- 将字符串与二叉搜索树中的对象进行比较
- C++ 在 std::set 的嵌套对中搜索对象
- 从对象向量中搜索变量
- 哪种数据结构是在一个向量中搜索和计数对象对的最佳数据结构
- 按属性搜索对象的向量并返回迭代器
- 如何通过对象向量搜索匹配项
- 在矢量中搜索对象的任何实例时出错
- 对大于属性的元素的矢量对象进行二进制搜索
- 搜索相似对象
- 在二叉搜索树中搜索对象
- 在矢量中搜索对象
- 在二进制搜索树中对对象值排序
- 对象数组中的搜索操作
- 搜索嵌套类对象的数组
- 对数组的一部分进行对象搜索