Algorithm 顺序搜索与二进制搜索的比较

Algorithm 顺序搜索与二进制搜索的比较,algorithm,quicksort,binary-search,asymptotic-complexity,linear-search,Algorithm,Quicksort,Binary Search,Asymptotic Complexity,Linear Search,假设我有一个未排序的实数数组,长度N。我想找到数组中最大的非正数y,然后是小于y的第一个数x,以及大于y的第一个数z 我想从理论上比较顺序搜索和二进制搜索的非渐近性(即,不仅仅是大操作系统),以找到这些值。是否有理由声明: 顺序搜索需要 0排序比较 3*N搜索比较(三次连续搜索) 二进制搜索需要 2*N*ln(N)≈ 1.39*N*log_2(N)排序比较() , 最多进行log_2(N)比较以进行搜索(由于数组已排序,因此只有一次搜索,因此我们可以在找到y后查看排序数组中的相邻值以查找

假设我有一个未排序的实数数组,长度
N
。我想找到数组中最大的非正数
y
,然后是小于
y
的第一个数
x
,以及大于
y
的第一个数
z

我想从理论上比较顺序搜索和二进制搜索的非渐近性(即,不仅仅是大操作系统),以找到这些值。是否有理由声明:

  • 顺序搜索需要
    • 0
      排序比较
    • 3*N
      搜索比较(三次连续搜索)
  • 二进制搜索需要
    • 2*N*ln(N)≈ 1.39*N*log_2(N)
      排序比较() ,
    • 最多进行
      log_2(N)
      比较以进行搜索(由于数组已排序,因此只有一次搜索,因此我们可以在找到
      y
      后查看排序数组中的相邻值以查找
      x
      z
因此,我可以声明,如果

1.39*N*log_2(N) + log_2(N) < 3*N 
<=> 
0 < N < 3.44779
1.39*N*logu2(N)+logu2(N)<3*N
0

i、 e.仅适用于非常小的阵列?

是的,您的结论是正确的。然而,通常情况下,使用排序数组(或任何其他有组织的结构)的要点是只执行一次预处理步骤或很少执行预处理步骤,而不是频繁查询。经过多次查询,预处理成本得到了回报。

是的,您的结论是正确的。然而,通常情况下,使用排序数组(或任何其他有组织的结构)的要点是只执行一次预处理步骤或很少执行预处理步骤,而不是频繁查询。经过多次查询,预处理成本得到了回报。

是的,您的结论是正确的。然而,通常情况下,使用排序数组(或任何其他有组织的结构)的要点是只执行一次预处理步骤或很少执行预处理步骤,而不是频繁查询。经过多次查询,预处理成本得到了回报。

是的,您的结论是正确的。然而,通常情况下,使用排序数组(或任何其他有组织的结构)的要点是只执行一次预处理步骤或很少执行预处理步骤,而不是频繁查询。经过多次查询,预处理成本得到了回报。

不,这不是一个有效的结论,原因有几个

  • 你只考虑比较的成本(这是次要的),而不是分行和掉期的成本
  • 您使用的是quicksort执行的平均比较次数的近似值,该值仅渐近有效
  • 您使用“操作数”作为“速度”的替代。真正的处理器不需要固定的时间来执行给定的操作,它们在一个过程上花费的总时间不是每个操作执行时间的总和

  • 不,这不是一个有效的结论,有几个原因

    • 你只考虑比较的成本(这是次要的),而不是分行和掉期的成本
    • 您使用的是quicksort执行的平均比较次数的近似值,该值仅渐近有效
    • 您使用“操作数”作为“速度”的替代。真正的处理器不需要固定的时间来执行给定的操作,它们在一个过程上花费的总时间不是每个操作执行时间的总和

    • 不,这不是一个有效的结论,有几个原因

      • 你只考虑比较的成本(这是次要的),而不是分行和掉期的成本
      • 您使用的是quicksort执行的平均比较次数的近似值,该值仅渐近有效
      • 您使用“操作数”作为“速度”的替代。真正的处理器不需要固定的时间来执行给定的操作,它们在一个过程上花费的总时间不是每个操作执行时间的总和

      • 不,这不是一个有效的结论,有几个原因

        • 你只考虑比较的成本(这是次要的),而不是分行和掉期的成本
        • 您使用的是quicksort执行的平均比较次数的近似值,该值仅渐近有效
        • 您使用“操作数”作为“速度”的替代。真正的处理器不需要固定的时间来执行给定的操作,它们在一个过程上花费的总时间不是每个操作执行时间的总和

        如果只想搜索一次值,请执行顺序搜索。如果它不止一次,请考虑先对数组进行排序。如果只想搜索一次值,那么执行顺序搜索。如果它不止一次,请考虑先对数组进行排序。如果只想搜索一次值,那么执行顺序搜索。如果它不止一次,请考虑先对数组进行排序。如果只想搜索一次值,那么执行顺序搜索。如果它将不止一次,考虑首先排序数组。比较运行时(有利于二进制搜索在我的实现中的数组长度为100),什么(如果有的话)理论论证我可以用来证明使用一个算法在另一个?那么,现在你知道为什么有这样一个强调渐近分析,对于足够大的数据,它胜过任何常数因子。:-)要最终证明一种算法比另一种算法在有界问题规模上更快,唯一的方法是在目标硬件上对其进行分析。除了比较运行时(在我的实现中,它支持长度为100的数组的二进制搜索),我可以用什么(如果有的话)理论参数来证明使用一种算法优于另一种算法?嗯,现在你知道为什么如此强调渐近分析了,对于足够大的数据,它胜过任何常数因子。:-)