数据结构与算法学习总结(一)——概念介绍

Spark进行到机器学习的部分了,这部分会比较注重算法,所以我打算重新回顾一下数据结构与算法的相关内容,这一次重新学习我是参照中国大学MOOC(非常强大,很多名校的课程都有)上北大的数据结构与算法的教程,这里主要是做一些学习内容的总结,同时还在看两本书,估计更新进度不会快。

编写计算机程序的目的是为了解决实际的应用问题,所以大多数时候我们需要对问题进行抽象,分析并且抽象化问题的需求,再去建立问题模型,同时还需要将问题涉及到的数据进行抽象,用恰当的数据结构表示数学模型,最后在数据模型的基础上设计合适的算法来进行问题的求解。总结一下就是用数据结构+算法进行程序的设计来模拟和解决实际问题。

数据结构

介绍数据结构之前我们可以先了解一下什么是结构,一个结构,主要是包括一些实体以及实体之间的关系,把他们组合起来就成为一个有机的结构整体。

而数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。

数据结构中,有三个基本的面,首先是逻辑关系也就是实体之间它们有什么样的数学的逻辑关系,其次是它的存储结构,我们需要在计算机上对它进行一定的存储的组织,最后基于数据结构的运算或者说算法是它非常重要的一个方面。可以说数据结构是由逻辑、存储和运算这三个方面来组合的。在不同的应用场景下,我们强调的侧面可能不同,但它们都是不可缺少的。

数据结构的逻辑结构主要分为线性和非线性两大类。线性结构主要以数组、链表、栈、队列、串这样的线性表为代表。非线性结构又分为树和图这两大类。

图形结构
树形结构

 

 

 

 

 

 

 

 数据结构的存储结构是从逻辑到它的物理存储单元的一个映射,物理存储单元是在计算机的内存中,因为通常情况下我们需要对这个数据结构进行运算。存储的形式主要由顺序、链接、索引、散列组成。

抽象数据类型(Abstract Data Type)

抽象数据类型是随着模块化的发展和面向对象的这些方法一起相应的发展起来的,它定义了一组运算的数据模型,不关心数据的物理存储结构,使软件系统建立在数据之上。因此抽象数据类型主要包括逻辑和运算这两个方面,它一般先定义逻辑结构(数据对象及其关系)再定义运算(数据操作),数据操作在C++和JAVA等面向对象的语言里就体现为函数。

抽象数据结构二元组:<数据对象D,数据操作P>

我们来分析下栈的抽象数据类型,它的逻辑结构是线性表,数据操作的特点是:①只允许在栈的一端执行插入、删除操作②入栈、出栈、取栈顶、判断是否为空,接下来我们用代码表示,语言采用C++。

template <class T>             //C++模板类,java中是泛型
class Stack{
public:
    void clear();              //变为空栈
    bool push(const T item);   //item入栈
    bool pop(T & item);        //弹栈顶,成功返回true,否则false
    bool top(T & item);        //获取栈顶元素但不弹出
    bool isEmpty();            //判断栈是否为空
    bool isFull();             //判断栈是否已满
};

算法的特性

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。

算法的特性包括:

1.通用性,算法能够对参数化输入(参数可变)进行问题求解,并保证计算结果的正确性。也就是对同一类型的问题,算法可以通用。

2.有效性,算法由一系列具体步骤组成,是有限条指令组成的指令序列。

3.确定性,算法描述中的下一步应执行的步骤必须明确。

4.有穷性,算法的执行必须在有限步内结束,换句话说,算法不能含有死循环。

算法的方法分类

1.穷举法,例如顺序查找K值。

2.回溯、搜索,例如树和图的遍历。

3.递归分治,例如二分查找、快速排序、归并排序。

4.贪心法,例如Huffman编码树、最短路Dijkstra算法。

5.动态规划,例如最短路Floyd算法。

算法复杂性分析

同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法复杂性分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度空间复杂度来考虑。

时间复杂度

算法的时间复杂度是指执行算法所需要的计算工作量。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做:T(n)=Ο(f(n)) 因此,问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。

空间复杂度

算法的空间复杂度是指算法需要消耗的内存空间。其计算和表示方法与时间复杂度类似,一般都用复杂度的渐近性来表示。同时间复杂度相比,空间复杂度的分析要简单得多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值