第二章学习小结
对比于上学期所学的知识,能切实感觉到这个学期的课程更加深入和抽象,在学习上难度也有所增加,虽然上个学期就听老师推荐过博客园,但是真正开始写博客还是第一次,最直观的感受就是在完成博客的过程中,能够帮助我们梳理了一下知识点,算是复习了一遍
一、内容小结
1、线性表的定义:由n个数据特性相同的数据元素构成的有限序列,n=0时为空表
分为顺序表和链表
2、优缺点
顺序存储:优点:随机存取;缺点:插入、删除扩容不方便
链式存储:优点:方便插入、删除、扩容;缺点按下标查询效率低
3、数组在栈区为用户开辟存储位置,如果定义为全局变量,则在堆区(全局变量:在所有函数之外)
4、typedef把一个自己起的名字的类型用已经有的类型代替使用
用法:typedef 已有类型名 新名
5、bool类型
while(x)=>true
while (!x)=>false
6、申请大空间
int *a = new int[...]
7、head指向的节点的成员
head->next=*head.next
LinkList L;与LNode *p含义是一样的
8、数据结构分为逻辑结构和存储结构
逻辑结构:抽象概念,独立于计算机之外,包括线性结构和为线性结构
线性结构:线性表
非线性结构:树结构、图结构和集合结构
存储结构:包括顺序存储结构和链式存储结构
9、时间复杂度:执行算法所需的计算工作量
T(n)=O(f(n))
O(1)循环次数与n无关
O(n)一次循环
O(n^2)嵌套循环
10、空间复杂度:
(1)寄存本身所用的命令、常数、变量和输入数据
(2)数据进行操作的辅助存储空间
(3)算法在实现时所需要的辅助空间
二、作业的完成过程积累
1、求集合交集
#include <iostream>
#include <algorithm> //包含sort函数
using namespace std;
int main()
{int m, n, i = 0, count = 0, k = 0, x = 0, y = 0;cin >> m >> n;int *a = new int[100000]; //创建三个数组,c用来装交集int *b = new int[100000];int *c = new int[200000];for(i = 0; i < m; i++){ //循环输入两个集合的数cin >> a[i];}for(k = 0; k < n; k++){cin >> b[k];}sort(a ,a+m); //对两个数组排序,默认顺序sort(b ,b+n); while(x < m && y < n){ //逐个对比两个数组的大小,小的往后一位if(a[x]==b[y]){ //相同 c[count]=a[x];count++;x++;y++;}else if(a[x] > b[y]){ //b数组后移一位 y++; }else x++;}cout << count << endl; //输出相同的个数和元素 for(i = 0;i < count; i++){ cout<<c[i];if(i != count-1){ //最后一位不输出空格 cout << " ";}}
}
ps:这是代码,一开始我没有另外设x和y,直接用i和k,但是答案一直错误,后来发现,因为i在前面的的循环中已经被改变了,所以导致答案错误
2、sort函数的使用方法(开始地址,结束地址,compare),但是sort函数本身默认升序
三、学习问题
目前的学习中发现自己对于很多基础知识的掌握还不够牢固,且在思考问题上总是不能想到一个巧妙地解决方法
四、接下来的目标
多看一些题目,去思考怎么解题,多参考博客上优秀的代码,思考过后自己再打一遍,熟悉书上的只是概念