Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中,使用哪个STL按O(1)中的值查找索引+;_C++_Algorithm_Stl - Fatal编程技术网

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
看起来如何?