算法的概述:
是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算 法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任 务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 算法是独立存在的一种解决问题的方法和思想。 对于算法而言,实现的语言并不重要,重要的是思想。只要掌握了思想那么代码也就更加容易了。
数据结构的概述:
数据结构是计算机存储和组织数据的一种方式。数据结构就是把数据组织起来,为了更方便地使用数据我们为了解决问题,需要将数据保存下来,然后根据数据的存储方式来设计算法实现进行处理,那么数据的存储方式不同就会导致需要不同的算法进行处理。我们希望算法解决问题的效率越快越好,于是我们就需要考虑数据究竟如何保存的问题,这就是数据结构。
逻辑结构:
逻辑结构是从具体问题中抽象出来的模型,是抽象意义上的结构
集合结构:
集合结构中数据元素除了属于同一个集合外,他们之间没有任何其他的关系
线性结构:
线性结构中的数据元素之间存在一对一的关系
树形结构:
树形结构中的数据元素之间存在一对多的层次关系
图形结构:
图形结构的数据元素是多对多的关系
物理结构:
逻辑结构在计算机中真正的表示方式(又称为映像)称为物理结构,也可以叫做存储结构。常见 的物理结构有顺序存储结构、链式存储结构。
顺序存储结构:
把数据元素放到地址连续的存储单元里面,其数据间的逻辑关系和物理关系是一致的,比如我 们常用的数组就是顺序存储结构。
链式存储结构:
是把数据元素存放在任意的存储单元里面,这组存储单元可以是连续的也可以是不连续的。此 时,数据元素之间并不能反映元素间的逻辑关系,因此在链式存储结构中引进了一个指针存放 数据元素的地址,这样通过地址就可以找到相关联数据元素的位置。
线性结构和非线性结构:
线性结构:
线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系。线性结构有两种不同的存储结构,即顺序存储结构(数组)和链式存储结构(链表)。
顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的。
链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素结点存放数据元素以及相邻元素的地址信息。
线性结构常见的有:数组、队列、链表和栈。
非线性存储结构:
二维数组,多维数组,广义表,树结构,图结构。
算法的时间复杂度:
我们要计算算法时间耗费情况,首先我们得度量算法的执行时间,那么如何度量呢?
分析估算方法:
比较容易想到的方法就是我们把算法执行若干次,然后拿个计时器在旁边计时,这种事后统计的方法看上去的确不错,并且也并非要我们真的拿个计算器在旁边计算,因为计算机都提供了计时的功能。这种统计方法主要是通过设计好的测试程序和测试数据,利用计算机计时器对不同的算法编制的程序的运行时间进行比较,从而确定算法效率的高低,但是这种方法有很大的缺陷:必须依据算法实现编制好的测试程序,通常要花费大量时间和精力,测试完了如果发现测试的是非常糟糕的算法,那么之前所做的事情就全部白费了,并且不同的测试环境(硬件环境)的差别导致测试的结果差异也很大。
事前分析估算方法:
在计算机程序编写前,依据统计方法对算法进行估算,经过总结,我们发现一个高级语言编写的程序程序在计算机上运行所消耗的时间取决于下列因素:
1,算法采用的策略和方案;
2.编译产生的代码质量;
3.问题的输入规模(所谓的问题输入规模就是输入量的多少);
4.机器执行指令的速度;
由此可见,抛开这些与计算机硬件、软件有关的因素,一个程序的运行时间依赖于算法的好坏和问题的输入规模。如果算法固定,那么该算法的执行时间就只和问题的输入规模有关系了。我么再次以之前的求和案例为例,进行分析。
需求:
计算1到100的和。
上面这个例子中,如果我们要精确的研究循环的条件执行了多少次,是一件很麻烦的事情,并且,由于真正计算和代码内循环的循环体,所以,在研究算法的效率时,我们只考虑核心代码的执行次数,这样可以简化分析。
我们研究算法复杂度,侧重的是当输入规模不断增大时,算法的增长量的一个抽象(规律),而不是精确地定位需要执行多少次,因为如果是这样的话,我们又得考虑回编译期优化等问题,容易主次跌倒。我们不关心编写程序所用的语言是什么,也不关心这些程序将跑在什么样的计算机上,我们只关心它所实现的算法。这样,不计那些循环索引的递增和循环终止的条件、变量声明、打印结果等操作,最终在分析程序的运行时间时,最重要的是把程序看做是独立于程序设计语言的算法或一系列步骤。我们分析一个算法的运行时间,最重要的就是把核心操作的次数和输入规模关联起来。
后续文章的说明:
后续会更新一些各种算法的概念,例如顺续表,链表,栈,队列,二叉树,红黑树。和一些算法的实现过程。