Bliner'Site

高树靡阴,独木不林。


  • 首页

  • 分类9

  • 标签33

  • 归档211

  • 关于

  • 搜索

数据结构之线性表-线性表的抽象数据类型-学习笔记-7

发表于 2018-11-01 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

上节,我们学习了什么是线性表以及抽象数据类型,今天我们来看看线性表的抽象数据类型如何来使用。

感受抽象

还记得上节课我们讲的那个例子吗?升旗仪式排队:

1号小红
2号小明
3号小强
4号小姗
…
55号小美
56号小力

  • 因为我们记不住编号,所以只要记住前面的同学名称就可以了,也就是找到自己唯一的直接前驱同学就行了。这样大家就可以排好队了,这就是线性表的创建和初始化。
  • 但是发现55号小美太矮了,2号小明太高了,导致队伍不好看,所以就把队伍解散,老师准备重新根据身高排队。解散的动作就类似线性表重置位空表。
  • 刚排好队,发现3号小强请假了,那4号小珊就要向前挪动,4号小姗的前面就是2号小明了,这就是线性表删除数据。
  • 下次升旗仪式,3号小强回来了,就要插入2号小明和4号小姗之间,4号小姗退一位,然后3号小强回到自己的位置上。这就是线性表插入数据。
  • 升旗过程中呢,有学生会检查,发现我们队55号没有穿校服,就反馈给我,我就查了下花名册(线性结构哦),发现是55号是小红,这就是根据位序得到元素。
阅读全文 »

数据结构之线性表-线性表和抽象数据结构-学习笔记-6

发表于 2018-10-31 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

之前我们都在学习什么是数据结构以及如何评价一个算法的时间、空间复杂度,今天开始,我们学习一个最简单的数据结构,线性表。

感受数据结构

还记得小时候,排队去参加升旗仪式,老师们会按照高矮个将同学们分好位置,全班50多个人,怎么记住自己的位置呢?

1号小红
2号小明
3号小强
…
55号小美
56号小力

老师肯定不能告诉你,Bliner 你在32位,那你站队的时候还要从1数到32…如果8号没来..你还少数了…这样肯定不行。
所以,老师们一般都会这么告诉你,记住你前面的同学,下次你就站在这儿。
并且,如果有谁不在,也可以一下子就知道,因为肯定有同学会说,我前面的 XX 没来。

线性表

线性表就像刚才排队一样,具有线一样的性质。

定义:由 0 个或者多个数据元素组成的有限序列,就称为线性表。

  • 必须是序列:线性表是一个序列,元素之间有先来后到的关系。
  • 多个元素:如果存在多个元素,那么第一个元素无前驱,最后一个元素无后继,其他的元素只有一个前驱和后继。(类似 C 学指针时候的双链表)
  • 有限:线性表强调的是有限,事实上无论计算机发展到多强大,处理的数据一定是有限的。
阅读全文 »

数据结构绪论-时间复杂度和空间复杂度(下)-学习笔记-5

发表于 2018-10-31 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

我们结束了时间复杂度的学习,了解了常见的时间复杂度的计算以及不同时间复杂度之间的关系,今天我们看看最坏情况和平均情况,以及空间复杂度。

最坏情况和平均情况

比如有一个数列,我们想找数字 1

  • 最好情况:数列是从1~10排列,找第一个就找到1了,O(1)就搞定。
  • 最坏情况:最坏的就是数列是从10~1排列,找到最后一个 n 才找到10,那复杂度就是O( n )。
  • 平均情况:我们期望运行的时间,比如我希望3分钟搞定。
  • 最坏运行时间:这是一种保证,也就是说,我的算法在最坏情况也,需要多少时间搞定,通常情况下,我们说的运行时间,都是最坏运行时间。

算法的空间复杂度

在写代码的时候,我们可以用空间换取时间,当然也可以用时间换取空间。

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main(){
int year;
printf("请输入年份(如2018):\n");
scanf("%d",&year);
if((year%4==0 && year%100!=0 )|| year%400==0){
printf("%d年是闰年!",year);
}else{
printf("%d年不是闰年!",year);
}
}
阅读全文 »

数据结构绪论-时间复杂度和空间复杂度(中)-学习笔记-4

发表于 2018-10-31 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

前面我们讲了普通赋值、输出、打印的时间复杂度、也讲了循环、嵌套循环的时间复杂度,现在我们来看看在函数引用下,时间复杂度有什么不同。

例子

看看下面程序的时间复杂度

1
2
3
4
5
6
7
8
9
int i;  //执行1次
for(i=0;i<n;i++){
function(i);
}
// for 循环,复杂度为 O(n)
void function(int count){
printf("%d\n",count);
}
// 函数就执行了一个 printf 语句 复杂度位 O(1)

上面的循环语句,每执行一次,就会调用一次函数,函数是 1,循环 n 次 1 ,所以上面这个例子的时间复杂度是 O(n) 。

我们再来个复杂点的

1
2
3
4
5
6
7
8
9
10
11
12
int i;  //执行1次
for(i=0;i<n;i++){
function(i);
}
// for 循环,复杂度为 O(n)
void function(int count){
int j;
for (j=0;j<n;j++){
printf("%d",j);
}
}
// 函数内是一个循环,随着 count 的增加,循环次数减少
阅读全文 »

数据结构绪论-时间复杂度和空间复杂度(上)-学习笔记-3

发表于 2018-10-30 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

前一讲,我们介绍了什么是算法的量度,以及如何用渐进函数来看哪些对算法的复杂度影响最大,今天我们就来看看如何计算复杂度。

时间复杂度

  • 定义:在进行算法分析时,语句总的执行次数 T(n) 是关于问题规模 n 的函数,进而分析 T(n) 随 n 的变化情况并确定 T(n) 的数量级。所以,算法的时间复杂度,就是算法的时间量度:

    T(n)=O( f(n) )

  • 时间复杂度:它表示随问题规模 n 的增大,算法执行时间的增长率和 f(n) 的增长率相同。称作算法的渐进时间复杂度,简称为时间复杂度。

    f(n) 是问题规模 n 的某个函数(上节我们研究过,能够改变结果的那个函数)

上面的定义很复杂,但只要记住,执行次数==时间就可以了。

阅读全文 »

数据结构绪论-算法效率的度量方法?-学习笔记-2

发表于 2018-10-30 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

前面我们说,算法效率要高,这里的高其实就是算法的执行时间短,时间段效率自然高,那么我们就需要了解,如何判断一个算法的执行效率,也就是执行时间快不快。

事后统计法

我们知道,跑马拉松,选手快不快,是根据到达终点的时间来决定的。算法也一样,我们根据跑完一遍的时间来计算算法的效率。也就是事后统计法。
事后统计法:通过设计好的测试程序和数据,利用计算机计时器对不同的算法编程的程序的运行时间进行比较。从而确定算法的效率高低。

事后统计法的缺陷

这种事后统计法是需要测试程序和数据的….
准备测试程序和数据太费功夫了….
因为测试数据和程序要跟算法一对一匹配。
测试失败…不就凉了…

特别是:不同的测试环境,测试的结果差别非常大。

阅读全文 »

数据结构绪论-什么是数据结构和算法?-学习笔记-1

发表于 2018-10-30 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

前面我们学习了 C 语言的部分知识,我们知道要用计算机解决一个问题大致分为一下几个步骤:

  • 具体问题 抽象出 数学模型
  • 设计一个算法,解该数学模型
  • 编写一个程序
  • 调试程序,直到解决问题

那么第一步,找到数学模型,就是解决此问题的关键,我们从模型中找到操作对象,然后找到这些操作对象之间的关系,然后用数学语言去描述它们。

什么是数据结构

程序设计=数据结构+算法

再进一步,数据结构其实研究的就是关系,是数据元素相互之间存在的一种或多重特定关系的集合。

逻辑结构和物理结构

我们把数据结构分为逻辑结构和物理结构

  • 逻辑结构:数据对象中数据元素之间的相互关系,也是我们需要关注和讨论的问题。
  • 物理结构:表示数据的逻辑结构在计算机中的存储形式。
阅读全文 »

C语言复习-常见错误(下)-学习笔记-69

发表于 2018-10-29 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

近两个月的时间,顺着谭浩强老师的《C 语言程序设计(第四版)》,我们简要学习了一些 C 语言的知识,接下来三节,我们对常见问题和一些知识点进行回顾。

常见错误

我们梳理一下常见的错误。

混淆字符和字符串的表示形式

1
2
3
4
char m;
m="C";//这事不合法的,因为 m 是字符,用双信号包起来是 C+\0 的,所以会出错
m='C'
//改成单引号就对了!

自加和自减

在使用++和——的时候,要注意符号的优先级,比如在指针自加减时,因为++和——要高于,所以先执行 p++,即 p++ 后再当做指针使用。
宁可多加括号,也要搞清楚使用方法!

记得提前声明自定义函数

如果我们在使用时,没有声明要使用的自定义函数,系统就会报错,所以在使用自定义函数前,一定要先声明,不一定非要在 main 函数声明,在使用前即可。

阅读全文 »

C语言复习-常见错误(上)-学习笔记-68

发表于 2018-10-27 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

近两个月的时间,顺着谭浩强老师的《C 语言程序设计(第四版)》,我们简要学习了一些 C 语言的知识,接下来三节,我们对常见问题和一些知识点进行回顾。

常见错误

我们梳理一下常见的错误。

忘记定义变量。

1
2
3
4
x=3;
y=4;
printf("%d",x+y);
//没有声明变量类型

输入输出格式不统一

1
2
3
4
float x=3.3;
float y=4.3;
printf("%d",x+y);
//应该使用%f 类型输出

超出数据类型范围

int 和 short 都是-32768~32768,不能超出这个数。

1
2
3
int num;
num=99999;
//99999超出了 int 类型的数值范围
阅读全文 »

C语言中操作文件-文件读写的出错检测-学习笔记-67

发表于 2018-10-27 | 分类 笔记&教程 | 评论数: | 阅读次数:

引入

我们在使用输入输出函数的时候,可能会出现错误。所以 C 语言提供了一些函数,帮助我们检测这些错误!

ferror 函数

之前,我们总是根据输入输出函数的返回值来判断函数是否执行,成功。现在我们还可以使用 ferror 函数进行检查。

一般形式

ferror(fp);

返回值

如果返回值为 0 (假):表示未出错
如果返回值为非0:表示出错

注意,对同一个文件来说,每一次调用输入输出函数,都会产生一个新的 ferror 函数值,所以,应该在调用一个输入输出函数后立即检查 ferror 函数的值。

阅读全文 »

1…678…22
Bliner

Bliner

211 日志
9 分类
33 标签
RSS
推荐阅读
  • 关于GTD中项目“复盘”的一些看法
0%
© 2019 Bliner |
主题 — NexT.Pisces
|
鲁ICP备13021673号
访问人数 总访问量 次