使用无序映射与数组搜索
Posted
技术标签:
【中文标题】使用无序映射与数组搜索【英文标题】:Searching using unordered map vs array 【发布时间】:2021-01-06 04:22:58 【问题描述】:我有一个块分配函数,它接收一个数组,然后搜索它以找到指示可用空间的值0
,然后将块分配给可用的可用空间。我正在尝试使用无序映射来提高搜索0
s 的速度。在我的函数中,数组中的所有元素都插入到无序映射中。我想知道与仅使用数组相比,实现如下所示的无序映射是否会提高搜索速度?
int arr[] = 15, 11, 0, 0, 0, 27, 0, 0; // example array
int n = sizeof(arr)/sizeof(arr[0]);
unordered_map<int, int> hash;
for(i=n;i>=0;i--)
hash[i+1] = arr[i];
for(auto v : hash)
if(v.second==0)
return v.second;
int arr[] = 15, 11, 0, 0, 0, 27, 0, 0;
int n = sizeof(arr)/sizeof(arr[0]);
for(i=0;i<n;i++)
if(arr[i]==0)
return arr[i];
【问题讨论】:
【参考方案1】:首先,请注意,您编写的两个函数总是返回零,这不是您想要的。
现在,回答主要问题:不,这种方法没有帮助。在这两种情况下,您都只是迭代数组中的值,直到找到一个为零的值。这是最坏情况下的 O(n) 操作,在这里引入 unordered_map
只会减慢速度。
你可以在这里做的最相似的事情实际上会帮助就像
std::unordered_map<int, std::vector<int>> lookup;
for(int i = 0; i < n; i++)
lookup[arr[i]].push_back(i);
现在,如果你想找到一个包含零的块,你只需要一个来自 lookup[0]
的元素。
但是,鉴于我们只需要跟踪其中包含 zeroes 的块,而不是立即查找其中包含 13 的块,我们不妨这样做:
std::vector<int> emptyBlocks;
for(int i = 0; i < n; i++)
if(arr[i] == 0) emptyBlocks.push_back(i);
然后我们可以根据需要抓取空块。
请注意,您应该从emptyBlocks
的back 中取出块,以便从列表中删除它们不需要我们将所有内容都转移过来。如果出于某种原因需要先获取最小索引,请在构建空块列表时向后遍历 arr
。
也就是说,当您分配块时,通常您会尝试查找一系列 连续 空块。如果是,您可能想要的是一种查找给定大小的块的起点的方法。而且你可能也希望它被订购,这样你就可以要求“最小的块至少这么大”。
【讨论】:
这样做if(arr[i] == 0) emptyBlocks.push_back(i);
会比将0
s 存储在数组中更快,因为我已经有一个函数可以将0
存储在数组中并计算连续的0
s。有没有比数组更快的方法来按顺序遍历元素以获得0
值?
将它们放入向量中会比放入数组更快吗?没有。
如果你尝试分配连续的块,那么如果你存储块的长度可能会更快,就像我在上一段中描述的那样。以上是关于使用无序映射与数组搜索的主要内容,如果未能解决你的问题,请参考以下文章