
算法设计与分析课程总结怎么写
、急急急
一、算法分析的基本方法二、算法设计的基本策略
算法课程设计报告
计图形学我没学过,但学法设计与分析。
挺难的,最好你还是从一就好好学不然上完了发现什么都不知道,不过那个课考试好办。
因为内容是一些编程思想,很难考核。
就《算法设计与分析》这门,在进入正式内容之前,会讲一些基础概念和介绍算法复杂度的分析,如时间复杂度、空间复杂度,如何评价一个算法的优劣。
这个内容虽然数据结构里讲过,但在这门学科里讲得要系统深入一些。
然后就是会讲到一些经典的算法思想,比如递归和分治策略、贪心算法、回溯法、分支限界法、随机化算法等等,每个种算法是教给你一种策略、一种思想,其实只要这里的两三种思想深化到你的头脑中了,对你的编程是很有帮助的。
这门课以讲算法思想为主,另外也会介绍一些相关内容,比如动态规划、线性规划、网络流什么的,还有NP完全理论与近似算法。
c语言课程设计总结
2.背包问题:#include stdio.h#define N 3 \\\/*物品的最大件数*\\\/#define M 20 \\\/*背包的载重*\\\/\\\/* 此函数为贪心算法,参数x表示解向量,参数n表示物品的件数,参数w表示物品的 重量构成的数组,参数m表示背包的载重,参数b表示单位重量收益按非增次数排列 时的下标变化情况。
*\\\/ void GreedyKnapsack(float *x,int n,float *w,float m,int *b){ int i; float u=m; for(i=0;iu)break; x[b[i]]=1.0; u=u-w[b[i]]; } if(ip[0]\\\/w[0]>p[1]\\\/w[1],则a[N]={2,0,1}*\\\/ float x[N];\\\/*解向量*\\\/ int i,j,m,r; float w[]={18,15,10};\\\/*依次存储n个物品重量的数组*\\\/ float p[]={25,24,15};\\\/*依次存储n个物品收益的数组*\\\/ float pw[N];\\\/*依次存储单位重量收益p[i]\\\/w[i]的数组*\\\/\\\/*输出各物品重量*\\\/ printf(\\\ 各物品的重量:\\\ ); for(i=0;it) { m=j; t=pw[j]; } } if(m!=i) { t=pw[i]; pw[i]=pw[m]; pw[m]=t; r=a[i]; a[i]=a[m]; a[m]=r; } }\\\/*输出单位重量收益按非增次数排列时的下标变化情况*\\\/ printf(\\\ 单位重量收益按非增次数排列时的下标变化情况:\\\ ); for(i=0;i内部排序算法比较课程设计
按平均时间将排序分为四类: (1)平方阶(O(n2))排序 一般称为简单排序,例如直接插入、直接选择和冒泡排序; (2)线性对数阶(O(nlgn))排序 如快速、堆和归并排序; (3)O(n1+£)阶排序 £是介于0和1之间的常数,即0<£<1,如希尔排序; (4)线性阶(O(n))排序 如桶、箱和基数排序。
各种排序方法比较 简单排序中直接插入最好,快速排序最快,当文件为正序时,直接插入和冒泡均最佳。
影响排序效果的因素 因为不同的排序方法适应不同的应用环境和要求,所以选择合适的排序方法应综合考虑下列因素: ①待排序的记录数目n; ②记录的大小(规模); ③关键字的结构及其初始状态; ④对稳定性的要求; ⑤语言工具的条件; ⑥存储结构; ⑦时间和辅助空间复杂度等。
不同条件下,排序方法的选择 (1)若n较小(如n≤50),可采用直接插入或直接选择排序。
当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜; (3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短; 堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。
这两种排序都是不稳定的。
若要求排序稳定,则可选用归并排序。
但本章介绍的从单个记录起进行两两归并的 排序算法并不值得提倡,通常可以将它和直接插入排序结合在一起使用。
先利用直接插入排序求得较长的有序子文件,然后再两两归并之。
因为直接插入排序是稳定的,所以改进后的归并排序仍是稳定的。
(4)在基于比较的排序方法中,每次比较两个关键字的大小之后,仅仅出现两种可能的转移,因此可以用一棵二叉树来描述比较判定过程。
当文件的n个关键字随机分布时,任何借助于比较的排序算法,至少需要O(nlgn)的时间。
百度文库里也有说明,详见:下面是一段测试程序:用系统计时器算时间复杂度。
#include#include#include#include#define LIST_INIT_SIZE 50000int bj1,yd1,n;clock_t start_t,end_t;typedef struct { int key; }ElemType;typedef struct { ElemType *elem; int length;}SqList;void addlist(SqList &L){ int i;a: printf(请输入你要输入的个数:); scanf(%d,&n); if(n>50000) { printf(超出范围重新输入!!!\\\ ); goto a; } L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType)); if(!L.elem)exit(0); L.length=0; for(i=1;i30000)goto b; ++L.length; }}void SelectSort(SqList &L)\\\/\\\/选择{ start_t=clock(); int i,j,k,bj=0,yd=0; for(i=1;iL.elem[j+1].key) { L.elem[0].key=L.elem[j].key; L.elem[j].key=L.elem[j+1].key; L.elem[j+1].key=L.elem[0].key; yd+=3; } } i++; } end_t=clock(); printf(比较次数为 %d移动次数为 %d\\\ ,bj,yd); printf(排序用时为 %f\\\ ,float(end_t-start_t)\\\/CLK_TCK);}void InsertSort(SqList &L)\\\/\\\/直接插入{ start_t=clock(); int i,j,yd=0,bj=0; for(i=2;i<=L.length;i++) { if(L.elem[i].keyL.elem[j].key) { k=j; bj++; } } if(i!=k) { L.elem[0].key=L.elem[i].key; L.elem[i].key=L.elem[k].key; L.elem[k].key=L.elem[0].key; yd+=3; } w++; } d=d\\\/2; w=1; } end_t=clock(); printf(比较次数为 %d移动次数为 %d\\\ ,bj,yd); printf(排序用时为 %f\\\ ,float(end_t-start_t)\\\/CLK_TCK);}void BeforeSort(){ yd1=0,bj1=0;}void display(int m,int n){ printf(比较次数为 %d移动次数为 %d\\\ ,m,n);}int Partition(SqList &L,int low,int high)\\\/\\\/快速排序 { int pivotkey; L.elem[0]=L.elem[low]; yd1++; pivotkey=L.elem[low].key; while (low=pivotkey) --high; L.elem[low]=L.elem[high]; bj1++; yd1++; while (low算法设计与分析这门课要怎么学
首先你要把一些典型的算法搞清楚,如皇后问题,士兵渡河等等;然后就是一些常用的算法,如递归,排序⋯⋯接下来最重要的是要勤思考,思考一些解决问题的方法,说白了就是活学活用,勤学勤练。
希望有帮助