博文

http://acm.pku.edu.cn/course/,关于问题求解的好网址(2006-10-10 10:08:00)

http://acm.pku.edu.cn/course/

阅读全文(1423) | 评论:0 | 复制链接

问题求解 与 程序设计(2006-10-10 10:04:00)

·课程概要

开课单位:信息科学技术学院
课程编号:00831630
课程名称:问题求解与程序设计
课程类型:全校通选课
学时学分:学分2.0,总34学时
先修课程:计算概论
授课时间:周二9-10节
授课教室:电教125
主讲教师:李文新
助    教:hawking赵静

·最新通知

(5.26) 期末考试安排:5月29日上午9:00至11:00,计算中心4号机房
(4.27) 参考书目:《程序设计基础》,吴文虎 著,清华大学出版社,2003
       《计算机程序的构造与解释》,裘宗燕 译,机械工业出版社,2004
(4.04) 开始提交出题作业,好的题目将推荐给POJ月赛
(3.10) 一旦被采纳,即可获得奖金!@_@
(3.22) 总完成题数即时排名
(3.10) 上机安排:周日中午12:30至2:30,计算中心4号机房
(3.10) 公用帐号:jtx75-6:jsjtxk@student6
(3.10) 上机内容:网上练习赛
(2.17) 觉得课程太难的同学请看这里

·课程内容

周次
主题
相关材料和链接
作业
第一周(2.10)
第二周(2.17)
张一飞解题报告:一类博弈问题的解答过程
第三周(2.24)
第四周(3.2)
模拟问题
第五周(3.9)
第六周(3.16)
动态规划(1)
A Decorative Fence: Solution
第七周(3.23)
搜索
王知昆解题报告:搜索顺序的选择
第八周(3.30)
停课
出题
第九周(4.6)
动态规划(2)
施澍解题报告:1179 Polygon
贾晔解题报告:1166 The Clocks
第十周(4.13)
讨论(1)
张法睿解题报告:1015 Jury Compromise
第十一周(4.20)
讨论(2)
李逸男解题报告:1042 Gone Fishing
江云亮解题报告:1411 Extraterrestrial Intelligence
第十二周(4.27)
讨论(3)
畅明解题报告:由几个问题看搜索中内存的使用
李凡解题报告:1043 What's in a name
黄贝宁解题报告:1418 Viva Confetti
第十三周(5.4)
放假
第十四周(5.11)
讨论(4)
蒋竞解题报告:1090 Chain
张阜东解题报告:1609 Tiling Up Blocks
陈松泽解题报告:整数分划
第十五周(5.18)
 
第十六周(5.25)
最后一课

阅读全文(1511) | 评论:0 | 复制链接

计算机概论讲义(2006-10-10 10:00:00)

计算概论讲义

 

 第一讲

 计算机与人类社会

2004.09.08

 下载讲义

 第二讲

 计算机组成,操作系统

2004.09.15

  下载讲义

 第三讲

 计算机的输入与输出设备

2004.09.22  下载讲义

 第四讲

 计算机内部的信息表示与处理

2004.09.29   下载讲义

 第五讲

 计算机存储设备, Excel 2004.10.13  下载讲义

 第六讲

 操作系统,VC编程环境 VC6下载

2004.10.20  下载讲义
 第七讲

 计算机网络基础,编程入门

2004.10.27  下载讲义 下载参考资料
 第八讲

  编程入门续

2004.11.03  下载讲义
 第九讲

  数组

2004.11.10  下载讲义
 第十讲

  复杂数据类型与问题求解

2004.11.17  下载讲义
第十一讲

 习题课

2004.11.24  下载讲义
第十二讲

 指针、动态数组、函数

2004.12.01  下载讲义
第十三讲  习题课一

2004.12.08

    下载讲义 
第十四讲  习题课二 2004.12.15 下载讲义
第十五讲  习题课三 2004.12.22 下载讲义
第十六讲   复习与答疑问

阅读全文(1643) | 评论:1 | 复制链接

多媒体技术课程学习(2006-10-7 19:24:00)

第一章 引言
第二章 音频
第三章 图形图象
第四章 视频
第五章 多媒体压缩编码
第六章 多媒体计算机系统组成
第七章 系统开发与应用
第八章 超文本与WEB系统
第九章 多媒体通信
第十章 多媒体数据库系统

阅读全文(1360) | 评论:0 | 复制链接

NOIP初赛练习题(2006-8-15 22:40:00)

  NOIP初赛练习题
  
  下列设备哪一项不是计算机输入设备( )
  A)鼠标  B)扫描仪  C)数字化仪  D)绘图仪
  答案:C
  在外部设备中,绘图仪属于( ).
  A.输入设备 B.输出设备 C.辅(外)存储器 D.主(内)存储器
  答案:A
  (0.5)10=( )16.
  A) 0.1 B) 0.75 C) 0.8 D) 0.25
  答案:C
  设有一个含有13个元素的Hash表(O~12),Hash函数是:H(key)=key % 13,其中%是求余数运算。用线性探查法解决冲突,则对于序列(2、8、31、20、19、18、53、27),18应放在第几号格中( ) 。
  A) 5 B) 9 C) 4 D) 0
  答案:B
  要使1…8号格子的访问顺序为:8、2、6、3、7、3、1、4,则下图中的空格中应填入( ) 。
  1 2 3 4 5 6 7 8
  4 6 1 -1 7 3 2
  
  A) 6 B) O C) 5 D) 3
  答案:C
  将N个红球和M个黄球排成一行。例如:N=2,M=3可得到以下6种排法:
  红红黄黄黄 红黄红黄黄 红黄黄红黄 黄红红黄黄 黄红黄红黄 黄黄黄红红
  问题:当N=4,M=3时有多少种不同排法?(不用列出每种排法)
  答案:35
  在顺序表(2,5,7,10,14,15,18,23,35,41,52)中,用二分法查找12,所需的关键码比较的次数为( )
  A)2  B)3  C)4  D)5
  答案:C
  与二进制数101.01011等值的十六进制数为( )
  A)A.B B)5.51 C)A.51 D)5.58
  答案:D
  在计算机硬件系统中,cache是( )存储器
  A)只读  B)可编程只读  C)可擦除可编程只读  D)高速缓冲
  答案:D
  平面上有三条平行直线,每条直线上分别有7,5,6个点,且不同直线上三个点都不在同一条直线上。问用这些点为顶点,能组成多少个不同三角形?
  答案:751
  设循环队列中数组的下标范围是1–n,其头尾指针分别为f和r,则其元素个数为( ).
  A.r- f B.r- f +1
  C.(r- f ) MOD n+1 D.(r- f + n) MOD n
  答案:D
  在待排序的数据表已经为有序时,下列排序算法中花费时间反而多的是( ).
  A 堆排序 B 希尔排序 C 冒泡排序 D 快速排序
  答案:D
  线性表若采用链表存贮结构,要求内存中可用存贮单元地址( ).
  A.必须连续 B.部分地址必须连续
  C.一定不连续 D.连续不连续均可
  答案:D
  下列叙述中,正确的是( ).
  A.线性表的线性存贮结构优于链表存贮结构
  B.队列的操作方式是先进后出
  C.栈的操作方式是先进先出
  D.二维数组是指它的每个数据元素为一个线性表的线性表
  答案:D
  已知,按中序遍历二叉树的结果为:abc
  问:有多少种不同形态的二叉树可以得到这一遍历结果,并画出这些二叉树。
  答案:有 5 种不同形态的二叉树可以得到这一遍历结果;可画出的这些二叉树为:
   ① a ② b ③ a ④ c ⑤ c
   \ / \ \ / /
   b a c c a b
   \ / \ /
   c b b a
  已知在计算机C:\DOS下有一个正确的FORMAT.COM文件,当执行如下命令:
  C:\> FORMAT A: < 回车 > 得到的回答是 bad command or file name 提示信息,下面解释正确的是_____________。
  (A)根目录中没有AUTOEXEC.BAT 文件
  (B)在执行该命令前操作者没执行过PATH 命令
  (C)C:\DOS 中的FORMAT.COM文件有错
   (D)由于AUTOEXEC.BAT 或操作者最后执行过的PATH 命令缺少路径C:\DOS,或者根本没有执行PATH 命令
  答案:D
  将A盘上50个文件用C:\>COPY A: *.* 命令复制到C盘的当前目录中,在复制到某一个文件时,由于读数据出错,屏幕显示:Abort, Retrg , Ignore , Fail ? 键入“I”后,继续复制没再出现过错误信息,最后复制的结果是_________。
  (A)读数据出错的文件不正确,其他文件正确
  (B)读数据出错的文件不正确,其它文件也不正确
  (C)读数据出错的文件正确,其它文件不正确
  (D)复制的文件完全正确
  答案:A
  CPU处理数据的基本单位是字,一个字的字长( ) 。
   A) 为8个二进制位 B) 为16个二进制位
   C) 为32个二进制位 D) 与芯片的型号有关
  答案:D
  下列哪一种程序设计语言是解释执行的( ) 。
  A) Pascal B) GWBASIC C) C++ D) FORTRAN
  答案:B
  启动WORD的不正确方法是( ) 。
  A) 单击Office工具栏上的Word图标 B) 单击"开始"→"程序"→Word
  C) 单击"开始"→"运行",并输入Word按回车 D) 双击桌面上的"Word快捷图标"
  答案:C
  下面关于算法的错误说法是( )
  A)算法必须有输出   B)算法必须在计算机上用某种语言实现
  C)算法不一定有输入 D)算法必须在有限步执行后能结束
  答案:B
  2KB的内存能存储( )个汉字的机内码
  A)1024  B)516  C)2048  D)218
  答案:A
  DOS暂驻区中的程序主要是用于( )
  A)执行DOS内部命令  B)执行DOS外部命令
  C)执行DOS所有命令  D)基本输入输出
  答案:A
  以下对Windows的叙述中,正确的是( )
  A)从软盘上删除的文件和文件夹,不送到回收站
  B)在同一个文件夹中,可以创建两个同类、同名的文件
  C)删除了某个应用程序的快捷方式,将删除该应用程序对应的文件
  D)不能打开两个写字板应用程序
  答案:A
  下列设备哪一项不是计算机输入设备( )
  A)鼠标  B)扫描仪  C)数字化仪  D)绘图仪
  答案:C
  GB2312-80 规定了一级汉字3755个,二级汉字3008个,其中二级汉字字库中的汉字是以( )为序排列的.
  A.以笔划多少 B.以部首 C.以ASCII码 D.以机内码
  答案:B
  WINDOWS 9X 是一种( )操作系统.
  A.单任务字符方式 B.单任务图形方式
  C.多任务字符方式 D.多任务图形方式
  答案:D
  大家知道,不同类型的存储器组成了多层次结构的存储器体系,按存取速度从快到慢的排列是( ).
  A.快存 / 辅存 / 主存 B.外存 / 主存 / 辅存
  C.快存 / 主存 / 辅存 D.主存 / 辅存 / 外存
  答案:C
  MS-DOS 系统对磁盘信息进行管理和使用是__________为单位的。
  (A)文件 (B) 盘片 (C) 字节 (D) 命令
  答案:A
  如果用一个字节来表示整数,最高位用作符号位,其它位表示数值。例如:
  0 0 0 0 0 0 0 1
  ↑ 符号位表示正 表示+1
  1 0 0 0 0 0 0 1
  ↑ 符号位表示负 表示-1
   1.试问这样表示法的整数a 的范围应该是_____________________。
   (A) -127 ≤ a ≤ 127 (B) -128 ≤ a ≤ 128
   (C) –128 ≤ a < 128 (D) -128 < a ≤ 128
   2.在这样表示法中,以下 说法是正确的。
   (A)范围内的每一个数都只有唯一的格式
   (B)范围内的每一个数都有两种格式
   (C)范围内的一半数有两种格式
   (D)范围内只有一个数有两种表示格式答案:A、D
  下列IF语句中,ENDIF 表示相应IF的结束:
   y=0
   if x<0
   then Y=5
   else if x<10
   then y=10
   if x<100
   then y=100
   endif
   else y=200
   endif
   endif
   试指出:
   当X=80 时,运行的结果是______;
   当X=5 时,运行结果为_________。
   (A) Y=9 (B) Y=5 (C) Y=10 (D) Y=100 (E)Y=200
  答案:E、D

阅读全文(1809) | 评论:0 | 复制链接

阳光奥赛(www.noi3000.com),好网站(2006-8-15 21:47:00)

阳光奥赛(www.noi3000.com

---------算法部分--------转自:http://www.noi3000.com/ShowClass2.asp?ClassID=4---------

普通文章 [图文]图论的意义 (noi3000,2006年4月27日,192)热点文章
普通文章 程序设计中几何算法二 (noi3000,2006年4月17日,108)热点文章
普通文章 程序设计中几何算法一 (noi3000,2006年4月17日,129)热点文章
普通文章 汉诺塔问题 (noi3000,2006年3月13日,478)热点文章
普通文章 八皇后问题 (noi3000,2006年3月13日,298)热点文章
普通文章 算法设计(动态规划法) (noi3000,2006年3月13日,142)热点文章
普通文章 算法设计(分治法) (noi3000,2006年3月13日,198)热点文章
普通文章 算法设计(贪婪法) (noi3000,2006年3月13日,149)热点文章
普通文章 算法设计(回溯法2) (noi3000,2006年3月13日,140)热点文章
普通文章 算法设计(回溯法1) (noi3000,2006年3月13日,200)热点文章
普通文章 算法设计(递归法) (noi3000,2006年3月12日,154)热点文章
普通文章 算法设计(递推法) (noi3000,2006年3月12日,53)
普通文章 算法设计(穷举搜索法) (noi3000,2006年3月12日,63)
普通文章 算法设计(迭代法) (noi3000,2006年3月12日,69)
普通文章 基本算法讲座之数学篇 (noi3000,2006年3月5日,76)
普通文章 排序算法简要说明 (佚名,2005年11月7日,88)热点文章
普通文章 什么是算法 (cz1800,2005年11月7日,108)热点文章

----------------------------------------------------------------------


阅读全文(1599) | 评论:0 | 复制链接

二分法查找(转)(2006-8-15 21:34:00)

作者tag:c/c++ CSDN 推荐tag:web 

http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.2.2.1.htm

二分法查找

1、二分查找(Binary Search)
     二分查找又称折半查找,它是一种效率较高的查找方法。
     二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。不妨设有序表是递增有序的。

2、二分查找的基本思想
     二分查找的基本思想是:(设R[low..high]是当前的查找区间)
 (1)首先确定该区间的中点位置:
                
 (2)然后将待查的K值与R[mid].key比较:若相等,则查找成功并返回此位置,否则须确定新的查找区间,继续二分查找,具体方法如下:
     ①若R[mid].key>K,则由表的有序性可知R[mid..n].keys均大于K,因此若表中存在关键字等于K的结点,则该结点必定是在位置mid左边的子表R[1..mid-1]中,故新的查找区间是左子表R[1..mid-1]。
     ②类似地,若R[mid].key<K,则要查找的K必在mid的右子表R[mid+1..n]中,即新的查找区间是右子表R[mid+1..n]。下一次查找是针对新的查找区间进行的。
     因此,从初始的查找区间R[1..n]开始,每经过一次与当前查找区间的中点位置上的结点关键字的比较,就可确定查找是否成功,不成功则当前的查找区间就缩小一半。这一过程重复直至找到关键字为K的结点,或者直至当前的查找区间为空(即查找失败)时为止。

3、二分查找算法
    int BinSearch(SeqList R,KeyType K)
      { //在有序表R[1..n]中进行二分查找,成功时返回结点的位置,失败时返回零
        int low=1,high=n,mid; //置当前查找区间上、下界的初值
        while(low<=high){ //当前查找区间R[low..high]非空
          mid=(low+high)/2;
          if(R[mid].key==K) return mid; //查找成功返回
          if(R[mid].kdy>K)
             high=mid-1; //继续在R[low..mid-1]中查找
          else
             low=mid+1; //继续在R[mid+1..high]中查找
         }
        return 0; //当low>high时表示查找区间为空,查找失败
       } //BinSeareh
  二分查找算法亦很容易给出其递归程序【参见练习】

4、 二分查找算法的执行过程
  设算法的输入实例中有序的关键字序列为
    (05,13,19,21,37,56,64,75,80,88,92)
要查找的关键字K分别是21和85。具体查找过程【参见动画演示】

5、二分查找判定树
     二分查找过程可用二叉树来描述:把当前查找区间的中间位置上的结点作为根,左子表和右子表中的结点分别作为根的左子树和右子树。由此得到的二叉树,称为描述二分查找的判定树(Decision Tree)或比较树(Comparison Tree)。
  注意:
     判定树的形态只与表结点个数n相关,而与输入实例中R[1..n].keys的取值无关。
   【例】具有11个结点的有序表可用下图所示的判定树来表示。
  
          

(1)二分查找判定树的组成
  ①圆结点即树中的内部结点。树中圆结点内的数字表示该结点在有序表中的位置。
  ②外部结点:圆结点中的所有空指针均用一个虚拟的方形结点来取代,即外部结点。
  ③树中某结点i与其左(右)孩子连接的左(右)分支上的标记"<"、"("、">"、")"表示:当待查关键字K<R[i].key(K>R[i].key)时,应走左(右)分支到达i的左(右)孩子,将该孩子的关键字进一步和K比较。若相等,则查找过程结束返回,否则继续将K与树中更下一层的结点比较。

(2)二分查找判定树的查找
  二分查找就是将给定值K与二分查找判定树的根结点的关键字进行比较。若相等,成功。否则若小于根结点的关键字,到左子树中查找。若大于根结点的关键字,则到右子树中查找。
  【例】对于有11个结点的表,若查找的结点是表中第6个结点,则只需进行一次比较;若查找的结点是表中第3或第9个结点,则需进行二次比较;找第1,4,7,10个结点需要比较三次;找到第2,5,8,11个结点需要比较四次。
     由此可见,成功的二分查找过程恰好是走了一条从判定树的根到被查结点的路径,经历比较的关键字次数恰为该结点在树中的层数。若查找失败,则其比较过程是经历了一条从判定树根到某个外部结点的路径,所需的关键字比较次数是该路径上内部结点的总数。
    【例】待查表的关键字序列为:(05,13,19,21,37,56,64,75,80,88,92),若要查找K=85的记录,所经过的内部结点为6、9、10,最后到达方形结点"9-10",其比较次数为3。
     实际上方形结点中"i-i+1"的含意为被查找值K是介于R[i].key和R[i+1].key之间的,即R[i].key<K<R[i+1].key。

(3)二分查找的平均查找长度
      设内部结点的总数为n=2h-1,则判定树是深度为h=lg(n+1)的满二叉树(深度h不计外部结点)。树中第k层上的结点个数为2k-1,查找它们所需的比较次数是k。因此在等概率假设下,二分查找成功时的平均查找长度为:
           ASLbn≈lg(n+1)-1
  二分查找在查找失败时所需比较的关键字个数不超过判定树的深度,在最坏情况下查找成功的比较次数也不超过判定树的深度。即为:
          
  二分查找的最坏性能和平均性能相当接近。

6、二分查找的优点和缺点
  虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费O(nlgn)的时间。
  二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。
  对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找。链表上无法实现二分查找。

二分法排序

#include <stdlib.h>
#include <stdio.h>
void TwoInsertSort(int array[],int n)
{
      int left,right,num;
      int middle,j,i;
      for(i = 1;i < n;i++)
      {
          left = 0;// 准备
          right = i-1;
          num = array[i];        
          while( right >= left)// 二分法查找插入位置
          {
              middle = ( left + right ) / 2; // 指向已排序好的中间位置
              if( num < array[middle] )// 即将插入的元素应当在在左区间
      right = middle-1;
     else                    // 即将插入的元素应当在右区间
      left = middle+1;   
          }
          for( j = i-1;j >= left;j-- )// 后移排序码大于R[i]的记录
              array[j+1] = array[j];
          array[left] = num;// 插入
      }
}

int rcmp( const int *a, const int *b)
{
 return (*a-*b);
}
void main()
{
 int array[50];
 int i;
 printf("The original array is :\n");
 for( i=0; i<50; i++ )//数组初始化并显示
 {
  array[i] = 50-i;
  printf("array[%d]:%d\n", i, array[i]);
 }
 TwoInsertSort(array,sizeof(array)/sizeof(int));//二分法排序
 printf("\nAfter sorted :\n");
 for( i=0; i<50; i++ )
  printf("array[%d]:%d\n", i, array[i]);

//库函数bsearch用二分法查找一个有序数组中的一个特定数,并返回该数的地址

 a = (int *)bsearch(&b, numarray, sizeof(numarray)/sizeof(numarray[0]), sizeof(int),rcmp);

}


阅读全文(1994) | 评论:0 | 复制链接

05_更多数据结构的课程请用以下网址登录(2006-8-15 21:14:00)

http://www.cstudyhome.com/datastruct1/index.htm

数据结构


阅读全文(1092) | 评论:0 | 复制链接

04_算法效率与存储空间需求(2006-8-15 21:11:00)

第四课

本课主题: 算法效率的度量和存储空间需求

教学目的: 掌握算法的渐近时间复杂度和空间复杂度的意义与作用

教学重点: 渐近时间复杂度的意义与作用及计算方法

教学难点: 渐近时间复杂度的意义

授课内容:

一、算法效率的度量

算法执行的时间是算法优劣和问题规模的函数。评价一个算法的优劣,可以在相同的规模下,考察算法执行时间的长短来进行判断。而一个程序的执行时间通常有两种方法:

1、事后统计的方法。

缺点:不利于较大范围内的算法比较。(异地,异时,异境)

2、事前分析估算的方法。

程序在计算机上运行所需时间的影响因素

算法本身选用的策略

 

问题的规模

规模越大,消耗时间越多

书写程序的语言

语言越高级,消耗时间越多

编译产生的机器代码质量

 

机器执行指令的速度

 

综上所述,为便于比较算法本身的优劣,应排除其它影响算法效率的因素。

从算法中选取一种对于所研究的问题来说是基本操作的原操作,以该基本操作重复执行的次数作为算法的时间量度。 (原操作在所有该问题的算法中都相同)

T(n)=O(f(n))

上示表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度

求4*4矩阵元素和,T(4)=O(f(4))

f=n*n;

sum(int num[4][4])

{ int i,j,r=0;
for(i=0;i<4;i++)

for(j=0;j<4;j++)

r+=num[i][j]; /*原操作*/

return r;
}

最好情况:
T(4)=O(0)

最坏情况:
T(4)=O(n*n)

ispass(int num[4][4])

{ int i,j;
for(i=0;i<4;i++)

for(j=0;j<4;j++)

if(num[i][j]!=i*4+j+1)

return 0;

return 1;
}

原操作执行次数和包含它的语句的频度相同。语句的频度指的是该语句重复执行的次数。

语句

频度

时间复杂度

{++x;s=0;}

1

O(1)

for(i=1;i<=n;++i)

{++x;s+=x;}

n

O(n)

for(j=1;j<=n;++j)

for(k=1;k<=n;++k)

{++x;s+=x;}

n*n

O(n*n)

 

O(log n)

 


 

基本操作的执行次数不确定时的时间复杂度

平均时间复杂度

依基本操作执行次数概率计算平均

最坏情况下时间复杂度

在最坏情况下基本操作执行次数

 

二、算法的存储空间需求

类似于算法的时间复杂度,空间复杂度可以作为算法所需存储空间的量度。

记作:

S(n)=O(f(n))

若额外空间相对于输入数据量来说是常数,则称此算法为原地工作

如果所占空间量依赖于特定的输入,则除特别指明外,均按最坏情况来分析。

三、总结

渐近时间复杂度

空间复杂度


阅读全文(1272) | 评论:0 | 复制链接

03_算法(2006-8-15 21:09:00)

转自(http://www.cstudyhome.com/datastruct1/class03/class03.htm

第三课

本课主题: 算法及算法设计要求

教学目的: 掌握算法的定义及特性,算法设计的要求

教学重点: 算法的特性,算法设计要求

教学难点: 算法设计的要求

授课内容:

一、算法的定义及特性

1、定义:

ispass(int num[4][4])

{ int i,j;
for(i=0;i<4;i++)

for(j=0;j<4;j++)

if(num[i][j]!=i*4+j+1)/*一条指令,多个操作*/

return 0;

return 1;
}/*上面是一个类似华容道游戏中判断游戏是否结束的算法*/

算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作;此外,一个算法还具有下列五个重要特性:

2、算法的五个特性:

有穷性

一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成;

确定性

算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。有任何条件下,算法只有唯一的一条执行路径,即对于相同的输入只能得出相同的输出。

可行性

一个算法是能行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。

输入

一个算法有零个或多个的输入,这些输入取自于某个特定的对象的集合。

输出

一个算法有一个或多个的输出。这些输出是同输入有着某些特定关系的量。

例:

有穷性

haha()
{/*only a joke,do nothing.*/
}
main()
{printf("请稍等...您将知道世界的未日...");
while(1)
haha();
}

确定性

float average(int *a,int num)
{int i;long sum=0;
for(i=0;i<num;i++)
sum+=*(a++);
return sum/num;
}
main()
{int score[10]={1,2,3,4,5,6,7,8,9,0};
printf("%f",average(score,10);
}

可行性

 

输入

 

输出

getsum(int num)
{
int i,sum=0;
for(i=1;i<=num;i++)
sum+=i;
} /*无输出的算法没有任何意义,

二、算法设计的要求

1、正确性

算法正确性的四个层次

程序不含语法错误。

max(int a,int b,int c)
{
if (a>b)
{if(a>c) return c;
else return a;
}
}

程序对于几组输入数据能够得出满足规格说明要求的结果。

max(int a,int b,int c)
{
if (a>b)
{if(a>c) return a;
else return c;
}
} /* 8,6,7 */ /* 9,3,2 */

程序对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果。

max(int a,int b,int c)
{
if (a>b)
{if(a>c) return a;
else return c;
}
else
{if(b>c) return b;
else return c;
}
}

程序对于一切合法的输入数据都能产生满足规格说明要求的结果。

 

2、可读性

3、健壮性

4、效率与低存储量需求

效率指的是算法执行时间。对于解决同一问题的多个算法,执行时间短的算法效率高。

存储量需求指算法执行过程中所需要的最大存储空间。

两者都与问题的规模有关。

 

算法一

算法二

在三个整数中求最大者

max(int a,int b,int c)
{if (a>b)
{if(a>c) return a;
else return c;
}
else
{if(b>c) return b;
else return c;
}/*无需额外存储空间,只需两次比较*/

max(int a[3])
{int c,int i;
c=a[0];
for(i=1;i<3;i++)
if (a[i]>c) c=a[i];
return c;
}
/*需要两个额外的存储空间,两次比较,至少一次赋值*/

/*共需5个整型数空间*/

求100个整数中最大者

同上的算法难写,难读

max(int a[100])
{int c,int i;
c=a[0];
for(i=1;i<100;i++)
if (a[i]>c) c=a[i];
return c;
}
/*共需102个整型数空间*/

三、总结

1、算法的特性

2、算法设计要求:正确性、可读性、健壮性、效率与低存储量需求。


阅读全文(1115) | 评论:0 | 复制链接