C++ 在C+中,使用哪个STL按O(1)中的值查找索引+;
假设我有一个数组C++ 在C+中,使用哪个STL按O(1)中的值查找索引+;,c++,algorithm,stl,C++,Algorithm,Stl,假设我有一个数组arr[]={1,3,5121242435412324,5} 我想知道O(1) 我该怎么做 附言: 1.在我的整个计划中,我将只查找索引,反之亦然(通过索引获取值)。 2.数组可以有重复项。使用C++11中的std::unordered_map将元素映射为键,索引映射为值。然后您可以在摊销O(1)复杂度中得到查询的答案标准::无序的_映射将起作用,因为没有你所说的重复,但会花费线性大小的额外空间 如果值的范围不是太大,也可以使用数组。这将产生更好的θ(1)复杂性。使用C++11中
arr[]={1,3,5121242435412324,5}
我想知道O(1)
我该怎么做 附言:
1.在我的整个计划中,我将只查找索引,反之亦然(通过索引获取值)。
2.数组可以有重复项。使用C++11中的
std::unordered_map
将元素映射为键,索引映射为值。然后您可以在摊销O(1)
复杂度中得到查询的答案<代码>标准::无序的_映射将起作用,因为没有你所说的重复,但会花费线性大小的额外空间
如果值的范围不是太大,也可以使用数组。这将产生更好的θ(1)复杂性。使用C++11中的
std::unordered_-map
映射元素作为键,索引作为值。然后您可以在摊销O(1)
复杂度中得到查询的答案<代码>标准::无序的_映射将起作用,因为没有你所说的重复,但会花费线性大小的额外空间
如果值的范围不是太大,也可以使用数组。这将产生更好的
theta(1)
复杂性。如果可以保证数组中没有重复项,那么最好创建一个unordered\u map
,其中map键是数组值,map值是其索引
我在下面编写了一个方法,它将数组转换为无序映射
#include <unordered_map>
#include <iostream>
template <typename T>
void arrayToMap(const T arr[], size_t arrSize, std::unordered_map<T, int>& map)
{
for(int i = 0; i < arrSize; ++i) {
map[arr[i]] = i;
}
}
int main()
{
int arr[] = { 1 , 3 , 5, 12124, 24354, 12324, 5 };
std::unordered_map<int, int> map;
arrayToMap(arr, sizeof(arr)/sizeof(*arr), map);
std::cout << "Value" << '\t' << "Index" << std::endl;
for(auto it = map.begin(), e = map.end(); it != e; ++it) {
std::cout << it->first << "\t" << it->second << std::endl;
}
}
<>最后,你应该考虑<代码> unordeDyMAP/<代码>的快速查找时间o(1)带有一些开销,因此它比简单数组使用更多的内存。但是,如果最终使用数组(相对而言,内存效率要高得多),则搜索特定值的保证是O(n),其中n是值的索引
编辑-如果需要保留索引最低而不是索引最高的副本,只需颠倒插入顺序即可:
template <typename T>
void arrayToMap(const T arr[], size_t arrSize, std::unordered_map<T, int>& map)
{
for(int i = arraySize - 1; i >= 0; --i) {
map[arr[i]] = i;
}
}
模板
无效数组映射(常量数组[],大小数组大小,标准::无序数组映射和映射)
{
对于(int i=arraySize-1;i>=0;--i){
map[arr[i]]=i;
}
}
如果可以保证数组中没有重复项,那么最好创建一个无序的\u map
,其中map键是数组值,map值是其索引
我在下面编写了一个方法,它将数组转换为无序映射
#include <unordered_map>
#include <iostream>
template <typename T>
void arrayToMap(const T arr[], size_t arrSize, std::unordered_map<T, int>& map)
{
for(int i = 0; i < arrSize; ++i) {
map[arr[i]] = i;
}
}
int main()
{
int arr[] = { 1 , 3 , 5, 12124, 24354, 12324, 5 };
std::unordered_map<int, int> map;
arrayToMap(arr, sizeof(arr)/sizeof(*arr), map);
std::cout << "Value" << '\t' << "Index" << std::endl;
for(auto it = map.begin(), e = map.end(); it != e; ++it) {
std::cout << it->first << "\t" << it->second << std::endl;
}
}
<>最后,你应该考虑<代码> unordeDyMAP/<代码>的快速查找时间o(1)带有一些开销,因此它比简单数组使用更多的内存。但是,如果最终使用数组(相对而言,内存效率要高得多),则搜索特定值的保证是O(n),其中n是值的索引
编辑-如果需要保留索引最低而不是索引最高的副本,只需颠倒插入顺序即可:
template <typename T>
void arrayToMap(const T arr[], size_t arrSize, std::unordered_map<T, int>& map)
{
for(int i = arraySize - 1; i >= 0; --i) {
map[arr[i]] = i;
}
}
模板
无效数组映射(常量数组[],大小数组大小,标准::无序数组映射和映射)
{
对于(int i=arraySize-1;i>=0;--i){
map[arr[i]]=i;
}
}
使用无序多重映射(仅限C++11),值作为键,位置索引作为值。使用无序多重映射(仅限C++11),值作为键,位置索引作为值。O(1)不可能与数组一起使用。如果对数组进行排序,则O(lg n)是最好的。因为在查找中,5优先。如果索引始终为2,则O(1)是可能的。std::unordered_map
将是最近的一个。如果该输入数组是允许的所有数组,则问题没有解决方案。任何试图产生比O(n)
更好的东西的尝试都需要对原始数组进行预处理或添加数据结构(通过预处理来构建它)。允许这样做吗?对于数组,O(1)是不可能的。如果对数组进行排序,则O(lg n)是最好的。因为在查找中,5优先。如果索引始终为2,则O(1)是可能的。std::unordered_map
将是最近的一个。如果该输入数组是允许的所有数组,则问题没有解决方案。任何试图产生比O(n)
更好的东西的尝试都需要对原始数组进行预处理或添加数据结构(通过预处理来构建它)。你可以走那条路吗?+1。我认为OP的评论表明,当存在重复项时,应该返回最低的索引。您的代码只需颠倒插入顺序即可实现这一点。@Keith这是一个简单的调整。我补充说,以防OP认为有必要。我认为OP的评论表明,当存在重复项时,应该返回最低的索引。您的代码只需颠倒插入顺序即可实现这一点。@Keith这是一个简单的调整。我补充说,以防OP认为有必要。在这些比较中,std::set
看起来如何?在这些比较中,std::set
看起来如何?