-----第一讲----第二节--------------什么是算法?-------------------------------------
算法(algorithm)(#include<algorithm>.....c++中的头文件).
1:有限的指令集.
2:无所谓是否接受输入,但是一定最少有一个输出
3:有限性...一定在有限步骤后终止.
4:指令必须有清楚的目标,不可以有歧义.
5:目标要符合实际.
6:伪代码实现(不依赖于任何一种语言)(这是什么意思呢? 意思就是 你需要知道这个思想.并且有能力用任何一种你会的语言表示来这种算法,学长们一直说这只用懂思想就行了...但是我感觉在了解思想之后必须用目前咱们会的语言写一次试试.假如你只懂思想的但是表示不出来,那又有什么用处呢?-----推荐大家买一本(C程序设计学习辅导)...咱们群里有文件)
算法就是用抽象的语言(和任何一种计算机语言都无关/和任何一种计算机语言都有关)这样 知道了他的思想就可以用任何一种计算机语言去实现在数据对象上的一系列操作(解决问题的办法)----这就是算法.
-------------------------------------------------------------什么是好的算法------------------------------------------------------------
好的算法应该有好的
1:时间复杂度(节省时间). (分析时间复杂度的时候一般分析最坏情况时间复杂度) 空间复杂度过高的算法会导致程序内存占用规模过大,导致程序爆掉.......例如第一节说的那个打印数字的两种不同算法.
2:空间复杂度不要太占用空间(曾经误以为时间复杂度是代码的长短~~~汗~~~). 时间复杂度过高的时候可能导致到死你都没等到计算机算出来那一道题.例如下面这两种不同算法的比较.
时间空间复杂度的表示方法都是一个常数乘以一个n...
算法的分析我们关心的只是算法的渐进
下面仔细说一下第一节 里哪两个多项式求解的函数.
//为什么他就要受到鄙视(正常人)
for(p=a[0],i=0;i<=n;i++) { p=p+a[i]*pow(x,i); }
//为什么说她就是一个好算法?(秦九韶) for(p=a[n],i=n;i>0;i--) { p=a[i-1]+x*p; }
在计算机中由计算机的结构决定计算加减法的速度远远大于计算乘除法的速度,所以在计算时间复杂度的时候 加减法可以适当的忽略,只计算乘除法的大概个数.
所以第一种受到鄙视的算法他的时间复杂度就是c1*(1+2+3+4+~~~~~+n)=c*(n!)
这个应该就是最恐怖的时间复杂度了.
第二种的时间复杂度是c*(n)/////这也算是很好的时间复杂度了.
===========================我是大分隔符============================
输入一组整数,求出这组数字子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那个序列。例如: 序列:-2 11 -4 13 -5 -2,则最大子序列和为20。 序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,则最大子序列和为16。
-----------------------------给一个 拍拍脑门救出来的简单方法------------------有点蠢--------------
//很粗鲁的方法 很暴力 时间复杂度为 n^2 #include<stdio.h> int main() { int a[10],i,j,m,n,max=0,num; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n;i++)//思想就是将所有的所有的子列和全部算出来.找出最大值就行 { for(num=0,j=i;j<n;j++)//很明显 时间复杂度为 n^2 { num=num+a[j]; if(max<num) max=num; } } printf("%d\n",max); }
-------------这个方法其实以前做题的时候我也想过但是没有动手实现------惭愧惭愧-------------现在写一下---------
--------一个效率比较高的程序是有副作用的 副作用就是,很多人看不懂------~~~汗~~~----------------------
1 //下面给一个高效的算法,时间复杂度是 n 唉,这应该这道题的是最优算法了,Rita 当时懒 2 //思想:就是 一个for循环解决问题, 从头开始一个个计算 如果其和是负数的话直接抛弃 如果不是的话并且大于max 3 //就记录下来. 4 //我当时担心的是如果只用中间的几个连续数字就达到了最大然后发生了继续往后加,又变成负数了.... 5 //只想说蠢蠢蠢!!!(太懒) 一会附上上解决方法 6 #include<stdio.h> 7 int main() 8 { 9 int a,i,j,m,n,max=-11111111,sum;//万一 输入的都是负数/////所以max的值需要很小 10 scanf("%d",&n); 11 for(sum=i=0;i<n;i++) 12 { 13 scanf("%d",&a); 14 sum=sum+a; 15 if(max<sum)//如果现在的值比最大值大就更新最大值 16 max=sum; 17 if(sum<0) //在这里如果小于零就直接讲现在的和归零,如果前面已经有最大值了也不怕因为 最大值出现了一下就被第15行记录了 18 sum=0; 19 } 20 printf("%d\n",max); 21 }