网易公开课哈佛大学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
- 网易公开课哈佛大学CS50学习笔记(2)
- 网易公开课哈佛大学CS50学习笔记
- 《哈佛大学公开课:幸福课》学习笔记(2)
- 公开课学习笔记-[哈佛]计算机科学CS50(一)
- 公开课学习笔记-[哈佛]计算机科学CS50(二)
- 公开课学习笔记-[哈佛]计算机科学CS50(三)
- 公开课学习笔记-[哈佛]计算机科学CS50(四)
- 公开课学习笔记-[哈佛]计算机科学CS50(五)
- 公开课学习笔记-[哈佛]计算机科学CS50(六)
- 公开课学习笔记-[哈佛]计算机科学CS50(七)
- 公开课学习笔记-[哈佛]计算机科学CS50(八)
- 公开课学习笔记-[哈佛]计算机科学CS50(九)
- 《哈佛大学公开课:幸福课》 学习笔记(1)
- 《哈佛大学公开课:幸福课》学习笔记(3)
- 《哈佛大学公开课:幸福课》学习笔记(4-9)
- 哈佛大学公开课《Positive Psychology 1504》学习笔记 -Perfection
- 哈佛大学公开课《Positive Psychology 1504》学习笔记 - Health
- 哈佛大学公开课《Positive Psychology 1504》学习笔记 - Relationship
- 证明利用快慢指针寻找有环单链表中环的起点算法
- 关于GC的一写东西
- Oracle 函数大全
- base64
- 求最小公倍数
- 网易公开课哈佛大学CS50学习笔记(2)
- 正则的[],(.)*?和(.*?),贪婪和惰性
- android 开发过程中采过的那些坑--工具篇1
- 2241: [SDOI2011]打地鼠 暴力
- 壳的编写(4)-- 获取被加壳文件的PE信息
- Qt之启动外部程序
- 断言,mark
- 关于不可变架构以及为什么需要不可变架构
- ambari安装hawq