Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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++;,检查是否已将数字添加到列表中,而无需强制搜索该列表_C++_Algorithm_Indexing_Time Complexity_Lookup - Fatal编程技术网

C++ 在C++;,检查是否已将数字添加到列表中,而无需强制搜索该列表

C++ 在C++;,检查是否已将数字添加到列表中,而无需强制搜索该列表,c++,algorithm,indexing,time-complexity,lookup,C++,Algorithm,Indexing,Time Complexity,Lookup,假设我有一个2D矩阵,由向量矩阵给出,并且矩阵已经初始化为具有R行和C列 还有一个坐标列表(例如,由N对(x,y对)组成),我们将对其进行处理,这样对于每个坐标,我们将得到到矩阵中特定行(r)和列(c)的映射。所以,我们基本上有[r,c]=f(x,y)。映射函数f的特殊性并不重要。然而,我们要做的是,通过将行r和列c插入另一个列表,即标记列表,来跟踪所使用的行r 问题是,如果列表中已经存在(r,c)对,我不想继续将相同的r和c添加到列表中。蛮力方法是每次我想检查时简单地扫描整个标记列表,但这将非

假设我有一个2D矩阵,由
向量矩阵
给出,并且
矩阵
已经初始化为具有
R
行和
C

还有一个坐标列表(例如,由N对(x,y对)组成),我们将对其进行处理,这样对于每个坐标,我们将得到到矩阵中特定行(
r
)和列(
c
)的映射。所以,我们基本上有
[r,c]=f(x,y)
。映射函数
f
的特殊性并不重要。然而,我们要做的是,通过将行
r
和列
c
插入另一个列表,即标记列表,来跟踪所使用的行
r

问题是,如果列表中已经存在
(r,c)
对,我不想继续将相同的
r
c
添加到列表中。蛮力方法是每次我想检查时简单地扫描整个标记列表,但这将非常耗时


例如,如果我们有坐标(x=4,y=5),这将产生(r=2,c=6)。因此,我们现在将(r=2,c=6)添加到标记列表中。现在我们得到一个新的点,由(x=-2,y=10)给出。这也最终落在(r=2,c=6)下。但是,因为我已经将(r=2,c=6)添加到我的列表中,所以我不想再添加它!但是,如果不对索引列表进行暴力扫描,还有更好的方法吗?

您需要一张地图来完成这项工作

如果你使用C++ 11,你可以使用无序的映射,它是一个哈希图,并且具有恒定的时间查找,如果你使用一个较旧的C++版本,你可以使用标准地图,这是一个树图,并且有一个对数查找。


如果没有很多项,性能差异不会很大。

而不是
map
unordered\u map
,您可以简单地使用一个矩阵
vector
,与另一个矩阵具有相同的
R
C
,每个字段都初始化为
false

不要在列表中添加和
(r,c)
配对,只需将矩阵中相应的布尔值设置为
true

使用
std::map
(或
std::unordered_map
)?@OliverCharlesworth感谢您的提示-高效索引对我来说是新的,所以感谢您的指导。我会查的。同时,你能简要描述一下它在这里的适用性,以补充我所读到的关于它的内容吗?再次感谢。你可以使用一个“反向矩阵”,用r和c作为坐标填充,只需检查它是否有值,如果没有,请填充,否则不要。谢谢Aleksandar。在我们谈话时,我正在查找无序的地图-我不太清楚它是如何管理一个固定时间查找的-在引擎盖下发生了什么?第二,我是否只需要输入它(r,c),然后让它输出。。。什么?。。。是否有人占用?谢谢。@Learnaholic基本上计算元素的散列,并根据散列尝试将其插入数组中,如果元素已经存在,它将找到下一个可能的散列。散列函数具有良好的散列算法,可以将冲突数减少到一个常量。更多检查。这取决于您是否使用无序映射—您有一个键和值,您可以询问该键是否存在,以及它的值是什么。否则你可以使用无序集,在这里你只能询问给定的密钥是否存在。谢谢-我已经读了一整天无序地图,但我似乎没有得到什么-似乎我必须“定义一个哈希函数”才能使用它?对于我的应用程序,我是这样描述的吗?@Learnaholic是的,您需要为它实现一个哈希函数。因为您可能有std::pair,所以应该检查这一个,答案显示了一个很好的散列实现。