Bliner'Site Bliner'Site

高树靡阴,独木不林。


  • 首页

  • 分类 10

  • 标签 36

  • 归档 214

  • 关于我

  • 搜索

标签:考研

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

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

引入

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

最坏情况和平均情况

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

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

算法的空间复杂度

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

#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 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 72

引入

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

例子

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

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) 。

我们再来个复杂点的

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 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 38

引入

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

时间复杂度

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

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

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

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

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

阅读全文 »

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

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

引入

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

事后统计法

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

事后统计法的缺陷

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

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

阅读全文 »

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

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

引入

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

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

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

什么是数据结构

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

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

逻辑结构和物理结构

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

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

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

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

引入

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

常见错误

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

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

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

自加和自减

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

记得提前声明自定义函数

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

阅读全文 »

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

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

引入

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

常见错误

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

忘记定义变量。

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

输入输出格式不统一

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

超出数据类型范围

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

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

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

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

引入

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

ferror 函数

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

一般形式

ferror(fp);

返回值

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

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

阅读全文 »

C语言中操作文件-随机读写数据文件(下)-学习笔记-66

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

引入

前面,我们知道了什么是文件位置标记,以及如何控制文件位置标记,学会了 rewind 和 fseek 这两个函数后,我们就来实现一下随机读写!

例子

输入10个学生成绩,然后存储到文件,接着读入文件,将1,3,5,7,9号学生数据输出到计算机上。

#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
int main(){
    struct Student{
        int num;
        char name[10];
        float score;
    }stu[10];
    //输入数据
    for (int i=0;i<10;i++){
        scanf("%d %s %f",&stu[i].num,stu[i].name,&stu[i].score);
    }
    //存储数据
    FILE *fp;
    fp=fopen("/Users/liulin/1.txt","wb");
    printf("存储的数据是:\n");
    for(int i=0;i<10;i++){
        fwrite(&stu[i],LEN,1,fp);
        printf("第%d号%s的成绩是:%3.1f\n",stu[i].num,stu[i].name,stu[i].score);
    }
    fclose(fp);
    //读入数据
    printf("1、3、5、7、9的数据是:\n");
    struct Student stu_in[10];
    fp=fopen("/Users/liulin/1.txt","rb");
    for(int i=0;i<10;i=i+2){
        fseek(fp,i*LEN,0);
        fread(&stu_in[i],LEN,1,fp);
        printf("第%d号%s的成绩是:%3.1f\n",stu_in[i].num,stu_in[i].name,stu_in[i].score);
    }
    fclose(fp);
    return 0;
}
阅读全文 »

C语言中操作文件-随机读写数据文件(上)-学习笔记-65

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

引入

我们之前讲的,都是对文件的顺序读写,很容易操作,但有时候效率不高。比如,文件中有1000个数据,我们如果需要找到第999号数据,那么需要从1遍历到998才可以。如果是一个城市几百万人的数据呢?所以随机访问应运而生,随机访问不是按数据在文件中的物理位置进行读写,而是可以对任何位置上的数据进行访问,显然这种方法比顺序访问高效的多。

文件位置标记

我们前面说过,w 方式打开是新建(有重名就删除再新建),文件标记在开头。a 方式打开是追加,文件标记在末尾。为了对读写进行控制,系统位每个文件设置了一个文件读写位置标记,简称(文件读写标记或文件标记),用来指示接下来要读写的下一个字符的位置。

文件位置读写标记

  • **顺序读文件:**一般情况下,在对字符文件进行顺序读写的时候,文件位置标记指向文件开头,这时,如果对文件进行读的操作,然后文件位置标记向后移动一个位置,如果再一次执行读操作,就会将位置2的字符读入,以此类推(我们前面的例子也说过)直到文件尾。
阅读全文 »
上一页 1 ... 6 7 8 ... 14 下一页
Bliner

Bliner

214 日志 10 分类 36 标签
RSS

推荐阅读

关于GTD中项目“复盘”的一想法
© 2008 - 2026 Bliner
鲁ICP备13021673号