学了专业已经一个学期多了,感觉并没有积累到什么东西,但是最近听到了一句话 “以前觉得代码什么都做不了,而现在觉得没有代码做不了的”。希望从现在开始 能写好博客,从点滴积累。
- 本章内容的小结
数据结构:分为逻辑结构(抽象)和存储结构(具体)
逻辑结构:分为线性结构和非线性结构【与数据元素本身的形式、内容、相对位置、个数无关】
线性结构:线性表、栈、队列、字符串、数组、广义表
非线性结构:树、图、集合(元素之间并无关系)
存储结构:顺序存储结构和链式存储结构
顺序存储结构:(地址/存储空间的连续性)
优点:随机存取
缺点:不方便删除、插入、扩容
链式存储结构:(地址/空间可以不连续)
优点:空间利用率高 (属于顺序存取)
某些术语:
数据元素:数据的基本单位
数据项:组成数据元素的最小单位
数据结构: 带结构的数据元素的集合
抽象数据类型(ADT)包括数据对象、数据对象上关系的集合、数据对象的基本操作的集合
独立于具体,将数据与操作封装一起,可实现信息隐藏。
与类的区别: ADT是概念层(抽象层) 类是应用层(实际化并解决问题)
在本章中还学到了两个语法
Ⅰ typedef + 已有类型名 + 新名字;
Ⅱ 内存的动态分配与释放 分配:指针变量=new 数据类型 释放: delete 指针变量
算法:5个特性:有穷性 确定性 可行性 输入 输出
评判标准:正确性 可读性 健壮性 高效性(时间复杂度和空间复杂度)
时间复杂度:(问题规模n、基本语句的执行次数)
T(n)=O(f(n))
例如:O(1)、O(m*n)、O(n²)、O(log3n)
空间复杂度:(辅助空间)
O(1):原地工作
插入一段小知识
数组越界:栈溢出访问(不一定会发生)
原因:①与编译器有关(编译器中的设置可对栈进行保护)
②与计算机体系结构有关
2.第二章中学习线性表的表示和实现
从顺序表和链式表展开
顺序表:静态数组不够大的时候
一般定义数组a[], 它的最大长度是有限制的,在栈内储存
解决方案:①在全局变量中定义数组,则将储存在堆内(堆>栈)
②空间不足的时候(也称内存泄漏)则可申请新空间
int *a = new int [长度] 存储在堆内
当申请了新的空间时需要人为回收空间 需delete。
链式表:主要通过指针指向下一个空间地址进行连接
在学习的过程中曾被指针变量和结点变量弄混
LinkList p 或LNode *p ,则p 是指针变量 而*p 是对应得结点变量
另外 头结点是一般不存储信息 ,从首元结点开始
结点之间得存储空间可不连续,结点内部必连续
之后就是顺序表和链式表的实现与表示
3. 在进行集合求交集的时候很绝望,一开始是按照定义3个数组,然后将数据输入进去到其中两个数组,然后将数组分别进行排序,然后就a[0]与b[0]比较,若相等则放进c数组,若a[0]>b[0] 则将b数组的下标往后移;若a[0]<b[0],则将a 数组的下标往后移,然后循环直到其中一个集合结束。
但是我虽然知道一定会超时,但是却有多种段错误,始终无法进行下去。
于是我去百度段错误
https://blog.csdn.net/e_road_by_u/article/details/61415732
在这篇文章中我以为是因为数组的空间太大,于是把数组定义为全局变量,在dev编译时无法发现错误,编译成功,但是在PTA上,仍没有变化。
后来我决定放弃自己的写法 去询问别人的想法
他将两个集合输入到同一个数组里,然后进行排序,然后遍历数组的时候将相同的值从copy进去到另外一个数组,然后最后直接输出。并且排序的时候直接运用sort算法的头文件#include<algorithm>
我发现速度非常快而且写的代码极少。于是我开始想我的代码为啥不能运行,从本质来讲应该没什么错误。
后来有发现我的形参没有传值过去,进行二次修改后发现仍然错误,于是事情并没有解决。由于时间关系,就草草了事。
4.接下来的目标是找出此次问题所在,纠正代码。
以后可以自己找出问题所在,独立打出可以run的代码。