C++ 在C++;,检查是否已将数字添加到列表中,而无需强制搜索该列表
假设我有一个2D矩阵,由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添加到列表中。蛮力方法是每次我想检查时简单地扫描整个标记列表,但这将非
向量矩阵
给出,并且矩阵
已经初始化为具有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,所以应该检查这一个,答案显示了一个很好的散列实现。