大话数据结构之二:算法

1.数据结构和算法的关系

个人感觉程序=算法+数据结构。数据结构是算法实现的基础,算法总是要依赖于某种数据结构来实现的。往往是在发展一种算法的时候,构建了适合于这种算法的数据结构。当然数据结构和算法也有区别:数据结构关注的是数据的逻辑结构、存储结构以及基本操作,而算法更多的是关注如何在数据结构的基础上解决实际问题。算法是编程的思想,数据结构则是这些思想的逻辑基础。

2.算法定义

算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

现实世界中的问题千奇百怪,算法也随着千变万化,没有通用的算法可以解决所有的问题。

3.算法特性

3.1输入

算法要具有零个或多个输入

3.2输出

算法至少有一个或多个输出

3.3有穷性

算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。

3.4确定性

算法的每一个步骤都有确定的含义,不会出现二义性。

3.5可行性

算法的每一步都必须是可行的,也就是说,每一步都能通过执行有限次数完成。

4.算法设计要求

4.1正确性

算法的正确性之算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求,能够得到问题的正确答案。

这里的正确分为四个层次:

1.      算法程序没有语法错误。

2.      算法程序对合法的输入数据能够产生满足要求的输出结果。

3.      算法程序对非法的输入数据能够得出满足规格说明的结果。

4.      算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果。

4.2可读性

设计出来的算法还要便于阅读、理解和交流。

4.3健壮性

当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果。

4.4较低的时间复杂度和空间复杂度

5.算法效率的度量方法

5.1事后统计方法

通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。

这种方法有很大的缺陷:

1.      必须依据算法实现编制好程序,这通常需要花费大量的时间和精力。如果编制出来的算法很糟糕达不到要求,就是竹篮打水一场空。

2.      算法的执行时间依赖计算机硬件和软件等环境因素,有时会掩盖算法本身的优劣。

3.      算法的测试数据设计困难,并且程序的运行时间往往与测试数据的规模有很大的关系,效率高的算法在小的测试数据面前得不到体现。

5.2事前分析估算法

在编写程序前,依据统计方法对算法进行估算。

一个用高级语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:

1.      算法采用的策略、方法;

2.      编译产生的代码质量;

3.      问题的输入规模;

4.      机器执行指令的速度。

 

6.函数的渐进增长

给定两个函数f(n)和g(n),如果存在一个整数N,是的对于所有的n>N, f(n)总是比g(n)大,那么我们说f(n)的增长渐进快于g(n).

判断一个算法效率时,函数中的常熟和其他次要项常常可以忽略,而更应该关注主项。

7.算法时间复杂度

在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的度量,记作:T(n)=O(f(n)).它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,乘坐算法的渐进时间复杂度,简称为时间复杂度。其中f(n)是问题规模n的某个函数。

推导大O阶的方法:

1.      用常熟1取代运行时间中的所有加法常数。

2.      在修改后的运行次数函数中,只保留最高阶项。

3.      如果最高阶项存在且不是1,则去除与这个项相乘的常数。

得到的结果就是大O阶。

算法的时间复杂度分为以下几种情况:

7.1常数阶

7.2线性阶

7.3对数阶

7.4平方阶

8.算法空间复杂度

算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:S(n) = O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。

在设计算法时,常用的一个技巧就是空间换时间。

时间: 2024-08-11 21:20:23

大话数据结构之二:算法的相关文章

大话数据结构十二:字符串的模式匹配(BM算法)

1. BM算法简介: KMP算法其实并不是效率最高的字符串匹配算法,实际应用的并不多,各种文本编辑器的"查找"功能大多采用的是BM算法(Boyer Moore).BM算法效率更高,更容易理解. 2. BM算法分析: (1) 假定字符串为"HERE IS A SIMPLE EXAMPLE",搜索词为"EXAMPLE". (2) 首先,"字符串"与"搜索词"头部对齐,从尾部开始比较.这是一个很聪明的想法,因为如

小菜一步一步学数据结构之(二)算法和算法分析

一次数学课上,老师让学生练习算数.于是让他们一个小时内算出1+2+3+4+5+6+--+100的得数.全班只有高斯用了不到20分钟给出了答案,因为他想到了用(1+100)+(2+99)+(3+98)--+(50+51)----一共有50个101,所以50×101就是1加到一百的得数.后来人们把这种简便算法称作高斯算法. 算法定义:一个有穷的指令集,这些指令为解决某一特定任务规定了一个运算序列 算法的描述: 自然语言 流程图 程序设计语言 伪码 算法的特性: 输入:有0个或多个输入 输出 : 有一

c语言数据结构,求算法

问题描述 c语言数据结构,求算法 把一个单链表LA中的奇数项和偶数项分开,分别放在两个单链表LB,LC中(要求利用原空间,头结点空间可另外开辟) 解决方案 (C语言-数据结构与算法)还原二叉树数据结构和算法系列 - c语言归并排序法 解决方案二: 对LA进行遍历,依次把LA中的项加入LB,LC中.依靠修改原LA中项的指针实现. 解决方案三: //输入时以-1结束#include <stdio.h>#include <stdlib.h>struct node{ int data; s

从零开始_学_数据结构(二)——树的基本概念

相比之前的帖子,对其进行了增添和完善. ps:本颜色的字体是后续添加内容 ------------------ 参考链接: 大话数据结构.pdf 图解数据结构(6)--树及树的遍历 http://www.cnblogs.com/yc_sunniwell/archive/2010/06/27/1766233.html   1.什么是树? 是一种数据结构,可以用来表示层次关系,因表示的样子很像一颗倒立的树而得名. 在数据结构中的特点,是一对多(链表是一对一,图是多对多)   最上面:树根 中间:树枝

cc++ 数据结...-数据结构关于抢红包算法问题

问题描述 数据结构关于抢红包算法问题 老师叫用队列模仿写一个微信抢红包程序,但不知道具体思路和算法,有了解的求赐教,菜鸟在这跪谢了! 解决方案 不要想很复杂,其实老师的让你做的关键不是什么抢红包,而只是队列. 定义一个链表或者数组来表示队列,实现入队.出队操作.入队在这里就是提交红包请求,出队就是抢到红包,先到先得,数量达到为止. 解决方案二: 数据结构与算法问题 朋友圈

大话数据结构五:线性表的链式存储结构(双向链表)

1. 双向链表:在单链表的每个结点中,再设置一个指向其前驱结点的指针域,那么在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前驱. 2. 单链表和双向链表比较: 单链表:总是要从头到尾找结点,只能正遍历,不能反遍历. 双向链表: 可以从头找到尾,也可以从尾找到头,即正反遍历都可以,可以有效提高算法的时间性能,但由于每个结点需要记录两份指针,所以在空间占用上略多一点,这就是通过空间来换时间. 3. Java实现双向链表: // 双向链表 public class DoubleLi

浅谈算法和数据结构 十二 无向图相关算法基础

从这篇文章开始介绍图相关的算法,这也是Algorithms在线课程第二部分的第一次课程笔记. 图的应用很广泛,也有很多非常有用的算法,当然也有很多待解决的问题,根据性质,图可以分为无向图和有向图.本文先介绍无向图,后文再介绍有向图. 之所以要研究图,是因为图在生活中应用比较广泛: 无向图 图是若干个顶点(Vertices)和边(Edges)相互连接组成的.边仅由两个顶点连接,并且没有方向的图称为无向图. 在研究图之前,有一些定义需要明确,下图中表示了图的一些基本属性的含义,这里就不多说明. 图的

大话数据结构十:字符串的模式匹配(BF算法)

1. BF算法简介: BF(Brute Force)算法是普通的模式匹配算法,又称为朴素匹配算法或蛮力算法,该算法最大缺点就是字符匹配失败指针就要回溯,所以性能很低. 2. BF算法思想: 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/ BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的第二个字符和P的第一个字符

大话数据结构十三:二叉树的链式存储结构(二叉链表)

1. 关于树 ① 树的度 - 也即是宽度,简单地说,就是结点的分支数. ② 树的深度 - 组成该树各结点的最大层次. ③ 森林 - 指若干棵互不相交的树的集合. ④ 有序树 - 指树中同层结点从左到右有次序排列,它们之间的次序不能互换,这样的树称为有序树,否则称为无序树. 2. 二叉树的特点 i.每个结点最多有两颗子树 ii.左子树和右子树是有顺序的,次序不能任意颠倒 iii.即使树中某结点只有一颗子树,也要区分它是左子树还是右子树 3. 二叉树五种形态 ① 空二叉树 ② 只有一个根结点 ③ 根