网易公开课哈佛大学CS50学习笔记(2)

来源:互联网 发布:站长 疯狗软件 编辑:程序博客网 时间:2024/05/03 01:17
网易公开课哈佛大学CS50学习笔记(2)
 函数调用自己是为什么出现段错误  因为在堆栈上加数。
内存耗尽。  递归的危险性,
  sigma   return (m + sigma(m-1) ); 递归的例子
  M小于O return 0;   用词 8+ sigma(7) 反复计算 计算后面的累加值  当调用sigma 停止。 sigma(0) =0 
处理事情

第九课
归并排序 分支算法 N LOGN

归并排序算法效率在选择和排序中 有最为直观的算法效率提升。

例子天平作为比较器
比较排序  冒泡是相邻两者的比较 
而选择是总体的比较 比较完接着下一个比较。 当找到一个最小后 整体的规模 便变为了N-1 但却忘记了本身联系。

划分和征服 (分治法)
DIVIDE AND CONQUER 
上万的数  对左部分排序 对问题再次划分  
1个元素 已经划分完成 因为问题中只有一个元素
2个元素比较 小的左边大的放右边  
再解决右边的四个杯子  两个合并 对左边4个排序
递归思想 
解决N个元素的算法思想 
on input of n elements:
 if n<2
   return.
 else: 
   Sort left half of elements.
   Sort right half of elements.
   Merge sorted halves.
例子
4 2 6 8 1 3 7 5
------- -------
--- ---| --- --- 
- - - -| - - - -
4 2|6 8|1 3|7 5
2 4|6 8|1 3|5 7     8 到4 一次 4 到2 一次 2 到1 一次 
2 4 6 8|1 3 5 7      总共是3 次  迭代是8次
1 2 3 4 5 6 7 8      3行   3*8=24次 所以算法最终复杂度 O(N)=N*logN  但与二分法不同的原因是 每次要合并 但是合并只要N次运行时间 T(n)= T(n/2)+T(n/2).
           T(n)= 0, (if n<2)为什么这条语句至关重要?
 假设对16个数字经行排序
 T(16)=2*T(8) +16
 T(8)=2*T(4) +8
 T(4)=2*T(2) +4
 T(2)=2*T(1) +2
 T(1)=0   所以往回带 T2=2  T4=4+4 ...T16=64  这就是原因 让递归最后能返回。
第十课 指针 文件输入输出
swap(int a int b) 做交换 因为作用域的问题 其它函数接不到值
升级版 
swap(int *a,int *b) //这是定义  内部声明 a是个地址 b是个地址
{
   int tmp= *a;
   *a= *b;//定位到b a=*b *a定位到b 把b的地址所在的值放在a之的位置
   *b=tmp;   
}     //临时局部变量   
告诉 main swap  x 和y 在哪? 就足够了 而不用携带两个int  传递的是&x &y   *定位符  &寻找 
     
swap(&a,&b) //这是调用

字符串指针 
char *s1 = GetInt(); // 正因为字符串是相连的 所以指针只需要指出第一个字符的地址 就可以找到整体的字符串位置。结束看见\0
char *s2 = GetInt();  
假如用户输入第一个字符串 再次输入第二个字符串 比较的是地址
返回的是不同的内存块   
  Getint()是个函数 返回用户第一个字符地址 把它存储到s1中
NULL  16进制是0x00 而00是专用的。 
演示例子中 char *s2=s1. s2复制的并不是整个字符串 而只是getint()返回的地址X 
   函数外部声明全局变量 他们不在栈中结束 在内存的顶端结束。任何函数在内存中使用它们。
   堆:RAM中一块内存 可进行动态内存分配。
 大多数 指针32位 S1□ input FOO

GETInt 做的 heap中 分配     F|O|O|\0|
 S1□ 方框中 地址 ————>F   (内存中的堆)
 S2□ 得到S1 即----------->F  S1与S2定位到一个目标
malloc 分配一个内存  sizeof(char)每个char 占用空间
malloc一般从堆中分配动态内存而不是栈 
copy2.c /将开头字符串复制到第二个 
int main(void)
{
 printf("Say something:");
 char *s1= GetString();//s1存储的是用户输入字符串首地址
 if(s1==NULL)
    return 1;
  char *s2=malloc((strlen(s1)+1)*sizeof(char));//用strlen 获得传递字符串长度,加1的目的是记录反斜杠 为其分配一个内存  S2存储S1内存的地址 假设输入的是FOO malloc返回
  if(s2==NULL)//判断是否内存不足   S1长度是3  
     return 1;
  int n=strlen(s1); //n=3
  for(int i =0;i<n;i++)
      s2[i]=s1[i];// s1[i] 指向第一个F S2[i] 迭代复制  因为3 i=2返回
   S2[n] ='\n';  为最后加一个记录结束
  printf("capitalizion copy..\n");
}
    另外一个例子 
int main()
{
  int *x;                         假若程序中预先 int *y; 没有指定一个内存 就为其分配一个值
  int *y;
      x=malloc(sizeof(int);
      x=42;
}                             int *y=13;  程序会崩溃 因为指定的内存很有可能是系统的
          y=x;合法 想把x的东西存储到y中
          再加上 *y =13;  把x中指向的值由42改为了13
             
0 0
原创粉丝点击