Bliner'Site Bliner'Site

高树靡阴,独木不林。


  • 首页

  • 分类 10

  • 标签 36

  • 归档 214

  • 关于我

  • 搜索

标签:考研

数据结构之线性表-KMP 算法(04)-学习笔记-45

发表于 2018-12-04 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 19

引入

未完待续…

阅读全文 »

数据结构之线性表-KMP 算法(03)-学习笔记-44

发表于 2018-12-04 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 20

引入

未完待续…

阅读全文 »

数据结构之线性表-KMP 算法(02)-学习笔记-43

发表于 2018-12-04 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 17

引入

未完待续…

阅读全文 »

数据结构之线性表-KMP 算法(01)-学习笔记-42

发表于 2018-12-04 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 18

引入

未完待续…

阅读全文 »

数据结构之线性表-递归解决八皇后问题-学习笔记-41

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

引入

八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。

简单思想

  • 将大问题化简称小问题
  • 8X8二维数组的任意一个位置
  • 一行一行来检查,符合要求的就把0改成1
  • 要求就是一列不能有1,一行不能有1,斜着不能有1
  • 一行一行的递归是一部分、检查行列斜有没有棋子1是一部分
  • 递归下去,然后回溯回来,就能将所有的情况列出来了。
阅读全文 »

数据结构之线性表-递归解决汉诺塔问题-学习笔记-40

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

引入

传说越南河内某间寺院有三根银棒

  • 其中一根银棒上串 64 个金盘
  • 金盘从上到下,由小至大。
  • 一次只移动一片,不管在那根针上
  • 但小片必须在大片上
  • 从一根银棒按照同样的要求,全部移动到另外一根银棒上,任务完成

若传说属实,僧侣们需要 $2^{64}-1$步才能完成这个任务
若他们每秒可完成一个盘子的移动,就需要 5845 亿年才能完成。整个宇宙现在也不过 137 亿年。

汉诺塔玩具

玩具汉诺塔-图片来自于维基百科
(图片来自于维基百科)

阅读全文 »

数据结构之线性表-递归实现-学习笔记-39

发表于 2018-12-02 | 分类 笔记&教程 | 评论数: 0 | 阅读次数: 20

引入

递归学习过编程的基本上都应该大体知道,但是递归的效率并不高,我们通常使用迭代循环,但我在探索未知的情况下,递归可能会更好。我们通过斐波那契数列来了解一下递归。

斐波那契数列

因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34…
即开始有一对儿兔子,然后3个月后兔子长大了,这对兔子会生一对儿兔子,之后的每个月这对儿兔子又生一对儿,假设兔子不会死亡,那么 N 个月后有多少对儿兔子。

理解

数列:1、1、2、3、5、8、13、21、34…
找到数列的规律之后,我们发现,3号数是1号+2号,6号数是4号+5号,即该数前两个数的和。

迭代循环解题

#include <stdio.h>
int main(){
    int f1=1,f2=1,f3;
    //将第1、2个月的数先赋值,作为计算基底
    printf("%12d\t%12d\t",f1,f2);
    //由于已经赋值了,所以就先输出
    for(int i=3;i<41;i++){
        f3=f1+f2;
        printf("%12d\t",f3);
        //利用循环输出第三个月的数,也就是前两个月的和
        if(i%4==0){
            printf("\n");
        }
        //判断换行
        f1=f2;
        f2=f3;
        //将用于相加的两个数向前推移
    }
}
阅读全文 »

数据结构之线性表-顺序存储结构的队列-学习笔记-38

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

引入

前面我们讲了,如何初始化一个循环队列,今天我们就来讲讲如何在队列中插入和删除数据。

入队列操作

如何判断队列已经满了

0 1 2 3 4 front rear 新 rear : (rear+1)%MAXSIZE
a 0:a 1: (1+1)%5=2
a b 0:a 2: (2+1)%5=3
a b c 0:a 3: (3+1)%5=4
b c d 1:b 4: (4+1)%5=0
c d e 2:c 0: (0+1)%5=1
f c d e 2:c 1 (1+1)%5=2
f g c d e 2:c 2 front=rear 所以满栈了

利用取模这个思路判断满栈就是

  • 就是让尾指针从头到尾不断的移动
  • 利用取模,让尾指针不断的在0~4之间移动
  • 如果尾指针指向了头部,也就是说
  • 可以插入的位置等于队列的第一个结点的位置了
  • 那就证明满栈了
void InsertQueue(struct Queue *q , int e){
    if((q->rear+1)% MAXSIZE==q->front){
        return;
    }
    q->base[q->rear]=e;
    q->rear = (q->rear+1) % MAXSIZE;
}
阅读全文 »

数据结构之线性表-顺序存储结构的队列-学习笔记-37

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

引入

我们之前说,队列我们一般使用的是链式存储结构,而不是顺序存储结构。我们今天就看看如何构造队列的顺序存储结构,然后看看顺序存储结构给队列带来了哪些问题。

想一想

我们假设,有一个队列

  • 有 n 个元素
  • 那么顺序存储结构就需要大于 n 的存储单元
  • 数组下标 0 是头部,n 个元素存储在数组的前 n 个存储单元中。


(图片来自于鱼 C 工作室)

入队

  • 0 号下标是队头
  • 然后数据不断进来,不断移动队尾指针。
  • 只需要将队尾指针+1即可
  • 时间复杂度为 O ( 1 )
阅读全文 »

数据结构之线性表-链式存储结构的队列操作-学习笔记-36

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

引入

我们学习了什么是队列,也了解了队列的一些基本特性,以及如何初始化一个队列,今天我们来看看如何创建和删除以及销毁一个队列。

创建一个队列

创建一个队列要注意以下两点

  • 创建一个头结点
  • 队列的头指针、尾指针都指向该结点
  • 因为队列是空的,这样就创建完成了
#include <stdio.h>
#include <stdlib.h>
#define sizeof(struct Queue)

struct Queue{
int data;
struct Queue *next;
};

struct Queue_link{
struct Queue *front;
struct Queue *rear;
}

void init(Queue_link *q){
q->frout=q->rear=(struct Queue *)malloc(LEN);
if(!q->front){
exit(0);
}
q->frount->next=NULL;
}
阅读全文 »
上一页 1 2 3 4 ... 14 下一页
Bliner

Bliner

214 日志 10 分类 36 标签
RSS

推荐阅读

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