在研究数据结构和算法时,我同时遇到这两个术语,但我无法区分访问和搜索。例如,阵列的时间复杂度包括在搜索O(n)时访问O(1)的时间。
答案 0 :(得分:4)
让我们想象一条街道,我们称之为列表街。列表街上有房子。第一栋房子的地址是101 List Street。第二宫的地址是102 List Street。等等等等。
让我们知道我们的朋友Element住在List Street的第4宫,然后我们知道 Element必须住在104 List Street。我们可以立即进入他们的房子,因为我们确切地知道它在街上的位置。我们只需访问 1 house就可以找到Element。
但是,如果我们不知道Element住在哪个房子怎么办?我们不得不敲开每个房子的门,询问Element是否住在那里。在这种情况下,我们需要访问4个房屋,直到我们到104 List Street找到Element。
同样的想法适用于数组。数组存储数据类型。每种数据类型都具有相同的大小,例如int
通常为4个字节。如果int
数组从内存地址0x0001
开始,并且我们想要访问任何元素,那么访问array[2]
所需的时间与array[102]
相同array[9999]
。因为我们知道起始地址,并且我们知道每种数据类型的大小,所以我们可以立即跳转到内存中的那个位置。 O(1)
但是,如果您正在尝试搜索以查找特定元素,那么您需要访问每个元素并测试它是否是您要查找的元素,直到达到所需的元素。对于包含5个元素的数组,您可能需要搜索5次。 O(5)。对于包含900个元素的数组,您可能需要搜索900次才能找到所需的元素。 O(900)。对于包含n
元素的数组,您将搜索n
次。为O(n)
答案 1 :(得分:0)
访问:获取A [i]元素值
搜索:查找数组中是否存在某个值(并获取它的索引)
答案 2 :(得分:0)
访问数组的元素意味着您知道它的索引并使用它指定要加载的元素。此操作具有 O(1)的复杂度,因为必须计算存储器中的位置以实现此目的,并且无论索引(少量时间),计算都花费相同的时间量。
搜索元素意味着您不知道它在哪里(在这种情况下)在数组中顺序搜索它。最好的情况是,第一个元素是您正在搜索的元素,使得进一步搜索毫无意义,但这是非常不可能的。最糟糕的情况是,您查看的最后一个元素是您要搜索的元素,这意味着您必须遍历数组的所有n( O(n)复杂度)元素到达你搜索的那个。实际上,如果n->无穷大,那么第一个或最后一个元素就是你要搜索的元素是非常不可能的,但很可能你必须按顺序查看很多元素。这个“批次”按比例随着元素的数量而增加,因此这是 O(n)的复杂性,或线性复杂度,因为线是
的函数f(x)= a * x + b
f'(x)= a
在这种情况下a = 1,但是当我们计算复杂度时,我们并不关心它是1还是2.我们关心它的导数,它是一个常数。而
的衍生物g(x)= a
是
g'(x)= 0
答案 3 :(得分:0)
让我们想一个类比:
连续有N
个邮箱,其中一个是您的邮箱。每个邮箱都有自己的所有者名称。
当然你知道它在哪里,所以你不需要真正停下来看看每个邮箱来到你的邮箱。 这是访问。
现在有一位新邮递员来问你,你知道哪个西蒙的邮箱?
"什么?什么哈希是西蒙?"你说,"我不知道,但我可以和你一起找到"
由于邮箱没有按照所有者姓名排序的特定订单,您可以逐个访问它们以检查它是否属于Simon's。现在整个过程正在搜索。
现在,为了进入您自己的邮箱,您只能进行一次访问,对吗?即使邮箱N
的数量发生了变化,这也不会改变!所以它是O(1)
但是对于搜索,最糟糕的情况是没有西蒙的邮箱,您只能知道此后访问所有邮箱,这是N
访问权限。所以它是O(N)