在 C++ 中,检查一个数字是否已经添加到列表中,而不用暴力搜索该列表
In C++, check if a number has already been added to a list, without brute force searching that list
假设我有一个二维矩阵,由 vector<vector<double>> matrix
给出,并且 matrix
已经初始化为具有 R
行和 C
列。
还有一个 坐标列表 (由 N
(x,y)
对组成),我们将要处理,这样对于每个坐标,我们都会得到到矩阵中特定行 (r
) 和列 (c
) 的映射。所以,我们基本上有 [r, c] = f(x,y)
。映射函数 f
的特殊性并不重要。但是,我们想要做的是跟踪使用的行 r
和列 c
,方法是将它们插入另一个列表,称为 list-of-indicies。
问题是,如果 (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,你可以使用 unordered_map,它是一个 hashmap 并且有一个恒定的时间查找,如果你使用旧版本的 c++,你可以使用标准映射,它是树状图,并具有对数查找。
如果你没有很多项目,性能差异不会很大。
而不是 map
或 unordered_map
你可以简单地使用一个矩阵 vector<vector<bool>>
与每个矩阵相同的 R
和 C
字段初始化为 false
。
您只需将矩阵中相应的布尔值设置为 true
.
,而不是将 (r,c)
对添加到列表中
假设我有一个二维矩阵,由 vector<vector<double>> matrix
给出,并且 matrix
已经初始化为具有 R
行和 C
列。
还有一个 坐标列表 (由 N
(x,y)
对组成),我们将要处理,这样对于每个坐标,我们都会得到到矩阵中特定行 (r
) 和列 (c
) 的映射。所以,我们基本上有 [r, c] = f(x,y)
。映射函数 f
的特殊性并不重要。但是,我们想要做的是跟踪使用的行 r
和列 c
,方法是将它们插入另一个列表,称为 list-of-indicies。
问题是,如果 (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,你可以使用 unordered_map,它是一个 hashmap 并且有一个恒定的时间查找,如果你使用旧版本的 c++,你可以使用标准映射,它是树状图,并具有对数查找。
如果你没有很多项目,性能差异不会很大。
而不是 map
或 unordered_map
你可以简单地使用一个矩阵 vector<vector<bool>>
与每个矩阵相同的 R
和 C
字段初始化为 false
。
您只需将矩阵中相应的布尔值设置为 true
.
(r,c)
对添加到列表中