`

非递归算法分析实例分享

阅读更多
1 仅仅依赖于问题规模的时间复杂度

(1) 例1: 交换i和j的内容   
 
  t = i;
    i = j;
    j = t;

    以上三条语句的频度均为1,该算法段的执行时间是一个与问题规模n无关的常数。
因此,算法的的时间复杂度为常数阶,记作T(n)=O(1)。

    算法的时间复杂度是O(1)。


(2) 例2: 循环次数直接依赖规模n   
  
 x = 0; y = 0;
    for(k = 1; k <= n; k++)
       x++;
    for(i = 1; i <= n; i++)
       for(j = 1; j <= n; j++)
          y++;


    一般情况下,对计数循环语句只需考虑循环体语句的执行次数,忽略该语句中步长加1、终值判别、控制转移等成分。
因此,以上算法段中频度最大的语句是"y++",其频度f(n) = n*n。

     算法的时间复杂度是O(n*n)。

     当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。

(3) 例3: 循环次数间接依赖规模n
  
 x = 1;
    for(i = 1; i <= n; i++)
       for(j = 1; j <= i; j++)
          for(k = 1; k <= j; k++)
              x++;

    该算法段中频度最大的语句是"x++"; 内层循环的执行次数虽然与问题规模n没有直接关系,但是却与外层循环的变量
取值有关,而最外层循环的直接次数直接与n有关。因此可以从内层向外逐层计算语句"x++"的频度:

  
    f(n) = $(i:1~n)$(j:1~i)$(k:1~j) = $(i:1~n)$(j:1~i)j = $(i:1~n)(i*(i+1)/2) = (n(n+1)(2n+1)/6 + n(n+1)/2)/2
   
    算法的时间复杂度是O(n*n*n)。

2. 算法的时间复杂度还与输入实例的初始状态有关

   例: 在数组a[0, n-1]中查找给定的值k
  
 i = n - 1;
    while(i > 0 && a[i] != k)
	i--;
    return a[i];

    频度较高语句为"a[i] != k"。此算法的频度不仅与问题规模n有关,还与输入实例中的a的各元素取值及k值有关。

    <1> 若a中没有与k相等的元素,则语句的f(n) = n, 这是最坏情况;

    <2> 若a的最后一个元素等于k,则语句的f(n) = 1,这是最好情况。

    在求成功查找的平均情况时,一般假设查找每个元素的概率都是相同的,
    则平均时间复杂度为:(1+2+...+n)/2 = (n+1)/2 = O(n)

   

   
      
分享到:
评论

相关推荐

    数据结构中递归转非递归算法分析及模型设计研究.pdf

    实例分析包括了对不同类型的数据结构,如线性表、树等,转换为非递归算法的具体实施,展现了转换过程中算法设计的细节和处理的关键点。这样的分析不仅加深了对递归本质的理解,也提高了对非递归实现的认识,为数据...

    阿克曼函数 c程序 递归与非递归算法的综合

    通过比较这两个程序,你可以看到递归和非递归算法在实现上的差异,以及它们在处理复杂递归问题时的不同策略。 理解并分析这两个程序,可以帮助你深入学习C语言编程,特别是递归和栈的概念。同时,这也为理解递归...

    汉诺塔问题的非递归算法分析

    Hanoi(汉诺)塔问题作为一个古典的数学问题,一直以来都是数据结构中递归算法的经典案例, 几乎没有介绍过其他的方法来解决此问题。文章分析讨论了一种非递归算法。

    C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法

    本文实例讲述了C++使用递归和非递归算法实现的二叉树叶子节点个数计算方法。分享给大家供大家参考,具体如下: /*求二叉树叶子节点个数 -- 采用递归和非递归方法 经调试可运行源码及分析如下: ***/ #include #...

    递归算法专题ppt

    - **非递归算法**:通常使用迭代(如循环)的方式解决问题,避免了递归带来的潜在问题,但可能不如递归算法简洁。 **实例分析**: 例如计算阶乘 n! 和累加 1+2+3+…+n 的递归与非递归实现。递归实现通过不断地自我...

    程序设计中递归算法

    因此,有时候会考虑将递归算法转换为非递归算法。非递归化的常见方法包括使用迭代结构替代递归调用,或者利用栈手动模拟递归调用过程。 - **使用迭代结构**:通过循环结构(如while循环)来模拟递归过程,避免了...

    ackermann函数的递归实现和非递归实现

    总结,阿克曼函数的递归和非递归实现都是理解递归、堆栈以及数据结构在计算复杂性中的作用的重要案例。非递归实现通过堆栈有效地避免了递归调用的限制,展示了如何用迭代方法解决原本看似需要递归的问题。

    Java基于栈方式解决汉诺塔问题实例【递归与非递归算法】

    本文主要介绍了Java基于栈方式解决汉诺塔问题的方法,结合实例形式分析了Java栈方式采用递归与非递归算法解决汉诺塔问题的相关操作技巧。 一、汉诺塔问题介绍 汉诺塔问题是一个经典的递归问题,描述的是有三个柱子...

    数据结构中递归转非递归算法分析及模型设计研究 (2011年)

    本文介绍了递归算法转为非递归算法的一般原则,并结合数据结构的特点设计了相应的转换模型,并通过实例验证了这些模型的可行性。 首先,本文分析了常见数据结构的递归本质,即这些数据结构在物理构造和逻辑意义上都...

    折半查找的递归算法

    ### 折半查找的递归算法 #### 一、引言 折半查找(也称为二分查找)是一种高效的查找算法,适用于有序数组。通过不断将查找区间对半分割,可以快速定位目标值的位置,时间复杂度为O(log n),其中n是数组长度。本文...

    合并排序算法非递归形式源码

    通过分析和理解`mergeSort.c`的源码,你可以学习到C语言编程技巧,如指针操作、数组处理以及如何构建和优化非递归算法。此外,结合实际运行代码,还可以加深对合并排序算法工作原理的理解,并可能启发你对其他排序...

    快速排序 --- 非递归实现

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R....总的来说,这个压缩包提供了一个非递归实现快速排序的完整示例,通过自定义栈的数据结构,实现了快速排序算法,适用于理解和学习快速排序的非递归实现方式。

    数据结构与算法(JAVA篇)之递归算法(二)

    为了更好地理解递归与非递归二分查找的应用,我们可以通过以下实例进行分析: ```java class BinarySearchApp { public static void main(String[] args) { int maxSize = 100; OrdArray arr = new OrdArray...

    递归程序的非递归化研究

    #### 一、递归与非递归算法的概念及对比 递归算法是一种直接或间接调用自身的算法,其核心思想在于将复杂问题分解为更小的相似子问题,并通过解决这些子问题来求解原问题。递归的优点在于其简洁性和易于理解,尤其...

    Java 数组递归算法的复杂度

    递归算法的复杂度分析通常比非递归算法更复杂,因为它涉及到递归调用的深度和分支数量。 **递归算法的时间复杂度**: - 对于递归算法而言,其时间复杂度往往可以通过递归树法或主定理(Master Theorem)来估算。 - ...

    斐波那契递归时间和非递归时间的比较(csdn)————程序.pdf

    非递归算法(迭代)则避免了重复计算,通过循环来逐步计算每一项。在这个例子中,它使用三个变量 `f1`, `f2`, `f3` 来存储斐波那契数列中的连续三项,并通过循环更新这些值。这种方法的时间复杂度为 O(n),因为它只...

    汉诺塔-非递归-java程序代码+实验报告

    总的来说,这个Java程序提供了一个理解和实践非递归算法解决复杂问题的机会,对于学习算法和数据结构的初学者来说,这是一个很好的案例研究。通过分析和运行这个程序,我们可以深入理解汉诺塔问题的解决方案,同时也...

    数据结构中递归算法的描述与实现.pdf

    因此,在实际应用中,需要充分理解递归算法,并且在可能的情况下,考虑将递归算法转化为非递归算法来优化性能。例如,可以使用迭代方法来进行树和图的遍历。 总之,递归算法在数据结构中的重要性不容忽视。它不仅...

    使用递归下降算法分析数学表达式 使用递归下降算法分析数学表达式 编译原理 课程设计报告.zip

    这个课程设计报告的主题是“使用递归下降算法分析数学表达式”,这涉及到计算机科学中的解析器构造,特别是对于计算数学公式或表达式的解析过程。 递归下降解析的核心在于将文法规则转化为一系列的函数,这些函数...

    链表先序建立二叉树,得到中序后序输出,递归和非递归实现(C++代码加设计报告)

    这一过程涉及到了数据结构中的核心概念——二叉链表,以及递归和非递归算法的应用。 首先,我们要理解二叉树的基本概念。二叉树是一种特殊的树形数据结构,其中每个节点最多有两个子节点,通常称为左子节点和右子...

Global site tag (gtag.js) - Google Analytics