【问题标题】:What is the difference between access and search in array?数组中的访问和搜索有什么区别?
【发布时间】:2017-03-09 16:15:47
【问题描述】:

在学习数据结构和算法时,我同时遇到了这两个术语,但我无法区分访问和搜索。例如数组的时间复杂度包括 O(1) 的访问时间,而搜索 O(n)。

【问题讨论】:

  • 在您的示例中提供更多上下文可能会有所帮助。访问数组中的元素是一个常数时间操作,在数组中搜索是一个线性操作。
  • 访问通常链接到数组中的位置。搜索通常链接到某个对象的值。因此蒂姆是对的。您应该添加更多上下文。

标签: algorithm data-structures


【解决方案1】:

让我们想象一条街道,我们称之为 List Street。在列表街上,有房子。第一所房子的地址是 101 List Street。第二间房子的地址是 102 List Street。等等等等。

假设我们知道我们的朋友 Element 住在 List Street 的 4th house,那么我们知道 Element 必须住在 List Street 104 号。我们可以立即进入他们的房子,因为我们确切地知道它在街上的位置。我们只需要访问 1 个房子就可以找到 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)

【讨论】:

  • 在树中访问和搜索怎么样?
【解决方案2】:

访问:获取 A[i] 元素值
搜索:查找数组中是否存在某个值(并获取它的索引)

【讨论】:

    【解决方案3】:

    访问数组的元素意味着您知道它的索引并使用它来指定要加载的元素。此操作的复杂度为 O(1),因为必须计算内存中的位置才能达到此目的,并且无论索引如何,计算都需要相同的时间(少量时间)。

    搜索一个元素意味着你不知道它在哪里,并且(在这种情况下)在数组中顺序搜索它。最好的情况是第一个元素就是您要搜索的元素,这使得进一步的搜索毫无意义,但这是极不可能的。最坏的情况是您查看的最后一个元素是您正在搜索的元素,这意味着您必须遍历数组的所有 n (O(n) 复杂度) 元素到达您要搜索的那个。实际上,如果 n->infinity,那么第一个或最后一个元素是您正在搜索的元素的可能性极小,但您可能必须按顺序查看很多元素。这个“手数”随着元素的数量成比例地增加,因此这是 O(n) 的复杂度,或线性复杂度,因为一条线是

    的函数

    f(x) = a * x + b

    f'(x) = a

    在这种情况下a = 1,但是当我们计算复杂度时,我们并不真正关心它是1还是2。我们关心它的导数,它是一个常数。而

    的导数

    g(x) = a

    g'(x) = 0

    【讨论】:

      【解决方案4】:

      让我们想一个类比:

      一排有N 邮箱,其中一个是你的。每个邮箱都有自己的所有者姓名。

      当然你知道它在哪里,所以你不需要真正停下来查看每个邮箱就可以到达你的邮箱。 这是访问权限


      现在一个新的邮递员过来问你知道西蒙的邮箱吗?

      “什么?西蒙是谁?”你说,“我不知道,但我可以和你一起找到

      由于邮箱没有按所有者姓名排序的特定顺序,您可以逐个访问它们以检查它是否属于Simon's。现在整个过程都在搜索


      现在,要访问您自己的邮箱,您只能进行一次访问,对吗?即使N 的邮箱数量发生变化,这也不会改变!所以是O(1)

      但是对于搜索,最坏的情况是没有西蒙的邮箱,你只能在访问所有邮箱后知道这一点,即N访问。所以是O(N)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-27
        • 2018-12-13
        • 2010-10-16
        • 1970-01-01
        • 2017-03-30
        • 2016-03-18
        • 2013-03-25
        • 1970-01-01
        相关资源
        最近更新 更多