【发布时间】:2019-10-14 21:03:56
【问题描述】:
我正在尝试在哈希中使用索引映射来搜索数组中的元素。线性搜索将花费 O(n) 来搜索大小为 n 的数组中的元素。在散列中,我们所做的基本上是通过创建一个 2d 零矩阵(例如 hash[1000][2])并将 hash[a[i]][0] 重新分配为 1,从而将时间复杂度降低到 O(1) a[i] 为正数,如果 a[i] 为负数,则为 hash[-a[i]][1]。这里 a[i] 是我们应该从中搜索元素的数组。
for(i=0 ;i<n ;i++)
{
if(a[i]>=0)
has[a[i]][0]=1;
else
has[-a[i]][1]=1;
}
上面的代码执行需要多少时间? 即使通过散列,我们不是像线性搜索一样具有 O(n) 的时间复杂度吗?在二维零数组中分配 n 个 1 所消耗的时间不等于以线性方式搜索元素所花费的时间吗?
【问题讨论】:
-
是的。但该时间只使用一次,而不是每次搜索时。
-
是的,创建哈希数组需要 O(n),但是每个查询需要 O(1) 时间。所以如果有O(n)个查询,使用哈希数组的时间复杂度是O(n)。但是对 O(n) 查询执行线性搜索需要 O(n^2) 时间。换句话说,构建散列数组来满足一个查询是没有意义的。但是,如果查询节省的时间可以弥补构建表所用的时间,那么它确实有意义。
-
理论上是的,您的复杂性将是 O(n) + O(1),即 O(n),但实际上它会优于您的线性搜索(假设您的散列方式不不会导致太多的碰撞)。
-
是的!现在完全有道理。谢谢!
-
创建哈希数组需要 O(n),但创建线性搜索数组也需要 O(n)。
标签: c indexing hash time-complexity