大致复习一遍数据结构

数据结构中的C/C++


2018/4/7

1.对于数据结构,大部分书籍还是以C、C++作为实现,因此,在用的公司的笔试中,有的题目中的代码,由这两种语言叙述。不要求能熟练使用,但至少要看懂基础代码吧。两年没怎么用,可以说是忘得差不多了。简略复习一波:
C语言:

结构体:用户自定义的可用的数据类型,它允许我们存储不同类型的数据项。
[注意:结构体只能定义成员变量,但是不能定义成员函数,但是却可以定义函数指针]

定义一个二叉树结构:

struct BTNode
{
   int   value;
   struct   BTNode *lchrild;
   struct   BTNode *rchrild;
};

[这里没有用“typedef定义别名”]
创建刚才定义的结构:

  • struct BTNode btNode;
  • struct BTNode *btNode;
    btNode = (BTNode*)malloc(sizeof(BTNode));

这两种方式是不同的
- 后者 btNode 是一个指针变量,有必要时可以指向别的节点,而前者不行;
- 前者取值用btNode.value,后者用btNode->value[也可以用(*btNode).value]

对于结构体,C++与C的不同之处:【参考[1]】
1.struct关键字:在C语言中,定义结构体变量的时候,struct不能省略。但是在C++之中则可以省略struct。也就是说,C语言中struct BTNode btNode,C++中BTNode btNode即可;

2.成员函数:C语言中的结构体只能定义成员变量,但是不能定义成员函数。然而在C++中既可以定义成员变量又可以定义成员函数;

3.成员初始化:不能直接初始化C中的结构数据成员,但我们可以在C ++中初始化;
4.静态成员: C结构不能有静态成员,但C++中允许使用;

5.sizeof运算符:该运算符将为C中的空结构生成0,而在C ++中为空结构生成1;

6.访问修饰符: C结构没有访问修饰符,因为这些修饰符不被语言支配。C ++结构的访问修饰符默认为public,C++中的struct是可以继承与被继承的

总的来说,其实就是面向过程与面向对象导致的区别。

今日错题集
1.栈是逻辑结构可以顺序存储也可以链式存储,只要满足后进先出。
2.若额外空间相对于输入数据量来说是常数”则称此算法为原地工作(也就是说:数据量变化时,不再开辟新的的空间,只是在现有的空间进行处理计算)。

暂时到这,未完待续。


线性表


2018/4/7
1.线性表的两种表示形式

顺序表
链表

2.两种实现的差异:

  • 空间分配:
    顺序存储结构:指定的是用一段地址连续的存储单元一次存储线性表的数据元素。空间分配只能预先进行,也就是静态分配。线性表的长度应该小于等于数组的长度;空间利用率高(局部性原理,连续存放,命中率高),但是当元素个数远少于预先分配的空间时,空间浪费巨大;分小了易发生上溢。
    链式存储结构:地址散落分布,动态分配,只要存储器还有空间,就不会发生存储溢出问题。但是因为需要“记忆”下一个节点的位置,节点的存储空间利用率要比顺序存储低一些。
  • 查找访问:顺序表支持随机访问,查找效率高,存取时间的性能为O(1);后者相反,O(n)
  • 删除增加:顺序表插入或者删除一个元素时,整个表需要遍历移动元素来重新排一次顺序,效率低,O(n);后者相反,O(1)。

3.使用场景

  • 频繁的查找却很少的插入和删除操作可以用顺序表存储,堆排序,二分查找适宜用顺序表.
  • 如果频繁的插入和删除操作很少的查询就可以使用链表存储(但是尾插尾删较多使用顺序表。)
  • 顺序表适宜于做查找这样的静态操作;链表适宜于做插入、删除这样的动态操作。
  • 若线性表长度变化不大,如果事先知道线性表的大致长度,比如一年12月,一周就是星期一至星期日共七天,且其主要操作是查找,则采用顺序表;若线性表长度变化较大或根本不知道多大时,且其主要操作是插入、删除,则采用链表,这样可以不需要考虑存储空间的大小问题。

4.双链表与单链表的比较

  • 在单链表中,有了next指针,这就使得我们要查找下一结点的事件复杂度为O(1)。可是如果我们想要查找的是上一节点的话,那最坏的时间复杂度就是O(n),我们每次都要从头开始遍历寻找。
    为了克服单向性这一缺点,设计出了双向链表。双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。

5.循环链表
循环链表解决了一个很麻烦的问题,如何从当中一个结点出发,访问到链表的全部结点。

6.链表中,有的实现由头结点,有的没有头结点
有头结点的,头指针head指向头结点,但是头结点的值为空,头指针head始终不为空,head->next为null时,链表才为null
没有头结点的,头指针直接指向第一个节点,也就是说,不带头结点的链表,所有节点都存储值,head为null,链表就为null


可以分别使用顺序表和链表实现几大排序算法
7.java中的线性表
线性表对应着下图里的List【参考[2]】
https://zhuanlan.zhihu.com/p/28346365

暂时到这,未完待续。


栈、队列

排序


2018/4/14
数据结构复习之顺序表以及链表的方式实现常用的几种排序算法

查找

参考

[1]C与C++结构体的区别
[2]Java数据结构之线性表

  • 11
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.1 单项选择题 1. 数据结构是一门研究非数值计算的程序设计问题中,数据元素的① 、数据信息在计算机中的② 以及一组相关的运算等的课程。 ① A.操作对象   B.计算方法  C.逻辑结构  D.数据映象 ② A.存储结构 B.关系 C.运算 D.算法 2. 数据结构DS(Data Struct)可以被形式地定义为DS=(D,R),其中D是① 的有限集合,R是D上的② 有限集合。 ① A.算法 B.数据元素 C.数据操作 D.数据对象 ② A.操作 B.映象 C.存储 D.关系 3. 在数据结构中,从逻辑上可以把数据结构分成 。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 4. 算法分析的目的是① ,算法分析的两个主要方面是② 。 ① A. 找出数据结构的合理性 B. 研究算法中的输入和输出的关系 C. 分析算法的效率以求改进 D. 分析算法的易懂性和文档性 ② A. 空间复杂性和时间复杂性 B. 正确性和简明性 C. 可读性和文档性 D. 数据复杂性和程序复杂性 5. 计算机算法指的是① ,它必具备输入、输出和② 等五个特性。 ① A. 计算方法 B. 排序方法 C. 解决问题的有限运算序列 D. 调度方法 ② A. 可行性、可移植性和可扩充性 B. 可行性、确定性和有穷性 C. 确定性、有穷性和稳定性 D. 易读性、稳定性和安全性 1.2 填空题(将正确的答案填在相应的空中) 1. 数据逻辑结构包括 、 、 和 四种类型,树形结构和图形结构合称为 。 2. 在线性结构中,第一个结点 前驱结点,其余每个结点有且只有 个前驱结点;最后一个结点 后续结点,其余每个结点有且只有 个后续结点。 3. 在树形结构中,树根结点没有 结点,其余每个结点有且只有 个直接前驱结点,叶子结点没有 结点,其余每个结点的直接后续结点可以 。 4. 在图形结构中,每个结点的前驱结点数和后续结点数可以 。 5. 线性结构中元素之间存在 关系,树形结构中元素之间存在 关系,图形结构中元素之间存在 关系。 6. 算法的五个重要特性是__ __ , __ __ , ___ _ , __ __ , _ ___。 7. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。 for (i=0;i<n;i++) for (j=0;j<n; j++) A[i][j]=0; 8. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。 for (i=0;i<n;i++) for (j=0; j<i; j++) A[i][j]=0; 9. 分析下面算法(程序段),给出最大语句频度 ,该算法的时间复杂度是__ __。 s=0; for (i=0;i<n;i++) for (j=0;j<n;j++) for (k=0;k<n;k++) s=s+B[i][j][k]; sum=s; 10. 分析下面算法(程序段)给出最大语句频度 ,该算法的时间复杂度是__ __。 int i=0,s=0; while (s<n) { i++; s+=i; //s=s+i } 11. 分析下面算法(程序段)给出最大语句频度 ,该算法的时间复杂度是__ __。 i=1; while (i<=n) i=i*2;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值