数据结构与算法导论之入门简介

简介: <p>目前,计算机加工处理的对象由纯粹的数值发展到字符、表格和图像等各种具有一定结构的数据,这就给程序设计带来了一些新的问题。为了编写一个好的程序,必须分析待处理的对象的特征以及各处理对象之间存在的关系,这就是“数据结构”这门学科形成和发展的背景。</p> <p>“数据结构”作为一门独立的课程,在国外是从1968年才开始设立的。</p> <p><br></p> <p>1、什么是数据结

目前,计算机加工处理的对象由纯粹的数值发展到字符、表格和图像等各种具有一定结构的数据,这就给程序设计带来了一些新的问题。为了编写一个好的程序,必须分析待处理的对象的特征以及各处理对象之间存在的关系,这就是“数据结构”这门学科形成和发展的背景。

“数据结构”作为一门独立的课程,在国外是从1968年才开始设立的。


1、什么是数据结构?

答:大量数据的组织方法。


2、什么是算法分析?

答:算法运行时间的估计。


3、在学习数据结构和算法分析的过程中,最重要的就是解决以下2个问题:

一是对于大规模的输入,如何估计程序的运行时间,更重要的是,弄清如何在尚未具体编码的情况下比较两个程序的运行时间;

二是如何提高程序的运行速度以及确定程序瓶颈的技巧。


4、递归的介绍

当一个函数用自身定义时就称为是递归(recursive)的。

C++允许函数是递归的,但必须要记住,C++所做的仅仅是试图遵循递归思想,不是所有的数学递归函数都能被有效或者正确地用C++的递归模型来实现。要点在于,递归函数f应该像非递归函数一样只用几行就能表示出来。下面给出一个实例。

#include <iostream>
using namespace std;

int f( int x )
{
    if( x == 0 )
        return 0;
    else
        return 2 * f( x - 1 ) +  x * x;
}

int main( )
{
    cout << "f(5) = " << f( 5 ) << endl;
    return 0;
}

实验结果如下:


注意:为了使结果在窗口保留以便观察,可以在return 0前面加上“cin.get();”吐舌头小技巧~~~

从代码可以看出,f(0)=0是基准情况,C++的递归若无基准情况也是毫无意义的,因为递归调用将一直进行到基准情形出现为止。


关于递归有几个可能混淆的概念:

(1)、它是循环逻辑吗?

答案:不是。因为递归虽然用一个函数本身来定义这个函数,但是并没有用一个函数实例本身来定义该特定实例。举例说明,f(5)是通过f(5)得到的值才是循环的,使用f(4)得到的f(5)就不是循环的。

(2)、递归与循环的区别与联系?

答案:后面详解。


下面给出一个“无终止递归函数”实例:

#include <iostream>
using namespace std;

int bad( int n )
{
    if( n == 0 )
        return 0;
    else
        return bad( n / 3 + 1 ) + n - 1;
}

int main( )
{
    cout << "bad is infinite recursion" << endl;
    return 0;
}

bad(1)被定义为bad(1),因此永远得不到正解,除0之外,此程序对任何非负n都无效。

上面的讨论引出递归的前两个基本法则:基准情形(base cases)、不断推进(making progress)。其余两个是:设计法则(design rule)、合成效益法则(compound interest rule)。


下面给出一个“打印整数的递归”例程作为练习。

#include <iostream>
using namespace std;

void printDigit( int n )
{
    cout << n;
}

void printOut( int n )  // Print nonnegative n
{
    if( n >= 10 )
        printOut( n / 10 );
    printDigit( n % 10 );
}

int main(  )
{
    printOut( 1369 );
    cout << endl;
    return 0;
}



目录
相关文章
|
1月前
|
存储 算法 数据处理
数据结构从入门到精通——栈
栈,作为一种后进先出(LIFO)的数据结构,在计算机科学中扮演着重要的角色。它的特性使得它在处理函数调用、括号匹配、表达式求值等问题时具有得天独厚的优势。然而,如果我们跳出传统思维的束缚,会发现栈的用途远不止于此。
56 0
|
1月前
|
存储 缓存 算法
数据结构从入门到精通——链表
链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的一个显著特点是,它不需要在内存中连续存储,因此可以高效地插入和删除节点。这种灵活性使得链表在许多应用中成为理想的选择,尤其是在需要动态调整数据结构大小的场景中。
72 0
|
1月前
|
存储 消息中间件 算法
数据结构从入门到精通——顺序表
顺序表是一种常见的线性数据结构,它使用一段连续的存储单元依次存储数据元素。这种数据结构的特点是逻辑上相邻的元素在物理存储位置上也相邻,因此可以快速地访问表中的任意元素。 顺序表的实现通常依赖于数组,数组是一种静态的数据结构,一旦创建,其大小就是固定的。这意味着在顺序表中插入或删除元素可能会导致空间的浪费或不足。例如,如果在一个已经满了的顺序表中插入一个新元素,就需要重新分配更大的数组空间,并将原有元素复制到新数组中,这是一个相对耗时的操作。
51 0
|
1月前
|
机器学习/深度学习 存储 缓存
数据结构从入门到精通——算法的时间复杂度和空间复杂度
算法的时间复杂度和空间复杂度是评估算法性能的两个重要指标。时间复杂度主要关注算法执行过程中所需的时间随输入规模的变化情况,而空间复杂度则关注算法执行过程中所需的最大存储空间或内存空间。
67 0
|
1月前
|
搜索推荐 算法 C语言
C语言选择排序算法,从入门到精通只需1秒!
C语言选择排序算法,从入门到精通只需1秒!
|
1月前
|
算法 前端开发
|
2月前
|
存储 算法 安全
【加密算法】AES对称加密算法简介
【加密算法】AES对称加密算法简介
|
2月前
|
机器学习/深度学习 算法 安全
【加密算法】RSA非对称加密算法简介
【加密算法】RSA非对称加密算法简介
|
10天前
|
算法
|
24天前
|
存储 算法 JavaScript
Java入门高频考查算法逻辑基础知识3-编程篇(超详细18题1.8万字参考编程实现)
解决这类问题时,建议采取下面的步骤: 理解数学原理:确保你懂得基本的数学公式和法则,这对于制定解决方案至关重要。 优化算法:了解时间复杂度和空间复杂度,并寻找优化的机会。特别注意避免不必要的重复计算。 代码实践:多编写实践代码,并确保你的代码是高效、清晰且稳健的。 错误检查和测试:要为你的代码编写测试案例,测试标准的、边缘情况以及异常输入。 进行复杂问题简化:面对复杂的问题时,先尝试简化问题,然后逐步分析和解决。 沟通和解释:在编写代码的时候清晰地沟通你的思路,不仅要写出正确的代码,还要能向面试官解释你的
33 0

热门文章

最新文章