数据结构与算法
文章平均质量分 74
夜里的柚子
“ 在荒谬被证实以前,都只是暗室里的装饰。只有眼前亮起来了以后,才有机会彰显它的价值不是谁能决定的。”
展开
-
<1> 程序的复杂性分析
1 . 什么是程序的复杂性?我们在写某些算法、或者某些程序片段的时候应该在Coding之前对自己的代码需要有一定的预估。比如我们如果写个排序被执行了“1”年,或者我们的代码最终生成的可执行文件超过了1G,相信任何一个产品经理都会直接恼火。所以,程序的复杂性在我理解,就是程序(算法、逻辑代码等)在空间资源和时间资源两个方面的消耗程度。2 . 四个数学定义··· 定义1:如果存在常数c和n原创 2017-09-25 14:38:28 · 2725 阅读 · 0 评论 -
<11> 继续动态规划(DP)
我发现动态规划这类问题有一个特点:”大问题依赖于某些小问题“。我倒觉得这种思想对于处理一些比较大的,一眼较难看出的问题比较合适的方式,但是通过分析之后,发现可以将大问题归结为小问题的解决,这些小问题环环相扣,直到问题被完全分解。· 1个问题:台阶问题,有个人正在上楼梯,楼梯有N个台阶,他可以一次性上1阶,2阶级,3阶级,那么计算他有多少种上楼梯的方式。分析:我们来看,这种问题乍一看貌似没什原创 2018-01-08 14:54:28 · 233 阅读 · 0 评论 -
<10> 递归与DP
"我感觉我自己对于递归的理解是我自己对于递归的理解”,或许这就是递归的含义吧,但是比较遗憾的是,我的这句话没有终止条件,也就是说,这句话一旦被执行,将会永远的执行下去。我的递归能力,自认为感觉不是很好,原因估计是递归有“层”的概念,需要你在写代码还是阅读代码、或者是debug的时候,脑海中深入到函数的下一层,下下一层···中考虑函数的执行过程究竟是什么。简单的递归比较好理解,但是稍微复杂的递归就有原创 2018-01-08 13:35:43 · 958 阅读 · 0 评论 -
<9> 素数
我感觉素数这一块也是比较重要的,尤其是在密码学、网络安全、身份验证等这一块。素数(也叫质数)是我们在小学?或者初中吧···学到的一个数学名词,含义是“只能被1和本身整除”。因此,这个概念可以被用来判断一个数字是不是素数,或者打印素数。(并且我们知道小于2的数字,都不是素数)#include #include #include #include // 素性测试bool isP原创 2018-01-08 09:25:29 · 301 阅读 · 0 评论 -
<9> 位操作知多少
1. 按位运算符能够针对数字的每一位进行操作,数据操作的背后是按照2进制的方式进行的。2. 截至目前,在C++中,按位运算符一共有6个(>、&、|、^、~)按位运算符号的用法1) >表达式:数值 左移操作符我们知道的是,二进制的每一位越往左,越大,,空出来的位置用0补上。·以13(10进制)为例,13(10进制)所对应的2进制为“0000000000001101”,左移3位原创 2018-01-05 11:39:09 · 243 阅读 · 0 评论 -
<8> 其实,队列也可以这么来替代。
两个栈来代替一个队列,一个栈正常存储数据,另一个栈在执行top()时候存储“从第一个栈中去取出来的数据”,并将第二个栈的顶端数据弹出即可。#include #include #include #include //----------------------------------------------------------------------------------原创 2018-01-04 15:49:37 · 285 阅读 · 0 评论 -
<7> 队列的各种操作
队列和栈一样,也是相对比较常见的数据结构。队列遵守的是“先进先出”的原则,因此在一些数据先到先处理的场景,可能会用到。下边使用C/C++编写了队列的自定义实现,其中包括创建、出队列,入队列、取值等。#include #include #include #include //------------------------------------------------------原创 2018-01-04 14:40:50 · 249 阅读 · 0 评论 -
<8> 单向循环链表在一些场景下的应用
我们经常会碰到类似“约瑟夫环”的问题,这类环类问题,一般可以使用单向循环链表来使用。#include #include typedef struct Person{ int ID; Person *next;}m_Person;m_Person* CreateLinkedList(int number,int *array) { m_Person *原创 2018-01-04 15:56:05 · 445 阅读 · 0 评论 -
<6> 栈的各种操作
栈是一种数据结构,“先进后出”是它的特点。#include #include #include #include //------------------------------------------------------------------------------------------------------------------//---------------原创 2018-01-04 13:45:57 · 178 阅读 · 0 评论 -
<5> 一些关于链表的练习
1 . 给定两个已经排序好的表L1,L2,只用基本的表操作编写计算L1∩L2的过程。std::vector interse(LinkList *l1, LinkList *l2){ std::vector Temp; for (size_t i = 0; l1!=NULL; i++) { if (Find4(l2, l1->_age)) { Temp.push_ba原创 2017-11-10 15:06:06 · 260 阅读 · 0 评论 -
<4> 头结点、头指针、和首元结点
1 . 概念头结点:在我看来,头结点其实是为了脱离整个数据链表,能轻易的找到首元结点、操作首元结点而设置的一个结点。头指针:头指针是一个指针,指向的是头结点,也就意味着头指针里储存着头结点的地址。首元结点:包含有数据的第一个结点。2 . 区别头结点:从上图看出,头结点的数据域里是没有数据的,它的指针域指向的是首元结点。头指针:仅仅是一个指向头结点的指针,为了方便操作原创 2017-11-09 09:11:11 · 1831 阅读 · 0 评论 -
<3> 单链表的各种操作(创建、增加、删除、修改、查找、逆序、判空、置空等)
1 . 链表的创建1)首先声明三个结构体指针变量(head、p1、p2),其中,一个是头结点,剩余的两个用来连接。2)给p1开辟内存空间,代表第一个结点的地址,并且给第一个结点的数据域中的数据赋值。3)循环创建(假设有N个结点需要创建)的过程。需要分情况,当我们的头结点并没有被连接到任何创建的结点上时,需要将head连接到,同时需要将p2也指向p1,这是因为当我们在将head连原创 2017-09-30 14:46:18 · 1994 阅读 · 0 评论 -
<2> 数组和链表的一般介绍
1 . 数组是什么?数组是具有某种相同特征的对象的集合。比如:int a[10]是一个存放10个整型数字的集合,double a[10]是一个存放10个双精度数字的集合等。数组其实是一个数据结构,因为当我们在声明并定义一个数组的时候,程序就会在内存中为我们申请一个连续的N*(sizeof ( type ))大小的空间。1 . 1 存放的位置栈:我们在函数(方法)中定义一个变量的时候,程原创 2017-09-29 16:45:42 · 344 阅读 · 0 评论 -
<12> 各 种 排 序
排序其实是我们在日常的项目开发中,比较常见的操作。比如:按”时间“将”帖子“排序,按”点击量“将”帖子“排序,按”观看数“将”视频“排序,按”分数“将学生的信息进行排序。这些都大量直接使用了排序的算法,或者间接的排序算法,或者是STL自带的算法,或者按照某个标准改良的排序算法等等。因此,了解常见排序算法的执行原理和执行过程,是理解排序的必要的条件。我们可以一起来看看常见的几种排序算法:1 .原创 2018-01-10 16:04:20 · 255 阅读 · 0 评论