博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构第二章小节
阅读量:7076 次
发布时间:2019-06-28

本文共 2332 字,大约阅读时间需要 7 分钟。

emm,之前有些总结,比如第一章放在csdn了,就po网址吧,不再复制过来了。(好懒)

第一章的一些基本概念,包括ADT、时间复杂度、空间复杂度啥的:https://blog.csdn.net/weixin_43314579/article/details/88045149

数组元素过多导致数组爆了:https://blog.csdn.net/weixin_43314579/article/details/88141451

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

来说说第二章,更为具体地学习了线性表,包括顺序表和链表以及其初始化、创建和输出。

然后搞明白了一点额外的知识点。

形参的种类及其能否改变实参:https://blog.csdn.net/weixin_43314579/article/details/88381831

做PTA的时候用new报错了,发现只有C没有C++的编译器,查了资料发现new是C++的关键字,在C中动态分配空间需要用到malloc函数

https://www.cnblogs.com/luoyang0515/p/10529761.html

哦对了,PTA更新后我就不喜欢了,还是老版本好...

不扯了,其实链表啥的还算能理解,但是用不好。特别是再加上排序、删除等功能,书没怎么看代码也没打过,有点虚。

很多时候会把指针和结点本身搞混。比如我定义了个指针p,指向某个结点。

p本身是指针啊,它代表了它指向的那个结点。

结点还有个指针域p->next也是指针啊,p->next又表示下个结点。

但p->next说是指向下个结点,是指向结点呢还是结点的数据域呢?

其实细想还是可以相同的,但总是一下子反应不过来。

说白了就是,指针,结点,傻傻分不清楚。

虽然链表和顺序表相比更难,但是也好用吧,毕竟顺序表的优势只是体现在按下标查找,在其他方面要么差不多,比如按值查找;要么就是链表强,比如进行增删查改。

至于算法,真的是个好东西,在这里细致讲讲。

那题十万个数据的实践题,一开始用for循环嵌套for循环,遍历两个数组,把每个数一一比较一遍....

1     for (int i = 0; i < m; i++) {        //遍历a数组,将a数组的每个数与b数组中的每个数比较2 3         for (int j = 0; j < n; j++) {4             if (a[i] == b[j]) {5                 c[num] = a[i];6                 num++;7             }8         }9     }

这能不超时?思前想后我想到个办法,就先把数组非降序排序,这样一旦发现相同的数就不用从头扫描,接着往下就行了。

1 for (int i = 0; i < m; i++) {      //遍历a数组,将a数组的每个数与b数组中的每个数比较,若a[i]==b[j],那么a[i+1]从b[j+1]开始比较 2         for (int j = temp; j < n; j++) { 3             if (a[i] == b[j]) { 4                 c[num] = a[i]; 5                 temp = j + 1; 6                 num++; 7                 break; 8             } 9         }10     }

过了吗?太天真了,当然没有。虽然第三个测试点的1万个数据的时间减少了将近一半,但由于还是两个for循环嵌套,时间复杂度没变,十万个数据还是挂了....

然后我么得办法了...直到上课讲到两个集合合并的时候采用排序-比较-提取的方法,用一个for循环就行了。这两题很相似啊,前面都一样,只要改一下提取的条件就行了,只用提取相同的数。

1 for (int i = 0, j = 0; i < m&&j
b[j]) { 3 j++; 4 continue; 5 } 6 else if (a[i] < b[j]) { 7 i++; 8 continue; 9 }10 else {11 c[num] = a[i];12 num++;13 i++;14 j++;15 continue;16 }17 }

于是,成功降低时间复杂度后,终于过了这题。

综上所述,好的算法很强大,只是你想的想不到的问题....这门课真难哇

虽然目前的问题基本都能通过网上查找解决,但我还有些点没涉及到,比如把动态申请的空间释放等方法用到程序中。希望在今后的学习中能涉及的更广,将学到的用上,学以致用,学有所用,才算真正学到东西了。

posted on
2019-03-16 15:54 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/luoyang0515/p/10542634.html

你可能感兴趣的文章
1036. [ZJOI2008]树的统计【树链剖分】
查看>>
JAVA中易出错的小问题(二)
查看>>
asp.net 用正则表达式过滤内容中的电话,qq,email
查看>>
1109 Group Photo
查看>>
Flutter插件开发之APK自动安装
查看>>
创建本地CM 离线服务器
查看>>
PHP数组操作——取数组最后一个值
查看>>
springboot集成swagger2
查看>>
react组件通信
查看>>
利用消息队列处理分布式事务
查看>>
UIScrollView中使用AutoLayout
查看>>
为什么用ls和du显示出来的文件大小有差别?
查看>>
node.js学习之流解析(一)
查看>>
YxdIOCP (DIOCP修改版)
查看>>
[Unity] Unity3D研究院编辑器之独立Inspector属性
查看>>
【c】插入排序
查看>>
大数据生态圈的一致性
查看>>
完美的代价
查看>>
程序内部让用户直接上appstore评价游戏的链接地址以及跳转方法
查看>>
【快学springboot】4.接口参数校验
查看>>