- 博客(37)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 浅析红黑树底层原理及实现
我们在上一篇博客认识到了平衡二叉树(AVLTree),了解到平衡二叉树的性质,其实平衡二叉树最大的作用就是查找,AVL树的查找、插入和删除在平均和最坏情况下都是O(logn)。AVL树的效率就是高在这个地方。如果在AVL树中插入或删除节点后,使得高度之差大于1。此时,AVL树的平衡状态就被破坏,它就不再是一棵二叉树;为了让它重新维持在一个平衡状态,就需要对其进行旋转处理, 现在呢,我们来思考一下虽...
2018-08-12 16:38:38
4331
原创 python遇见问题总结
1.a文件内未导入sleep函数,模块导入的时候b模块有sleep函数,此时在a文件内可以使用sleep函数但是会触发异常。2.ValueError: invalid literal for int() with base 10: ' ',强制转换的字符串为空...
2019-10-11 14:54:07
321
原创 Docker容器内appium环境的搭建
一、Docker简介Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。(具体可参考http://ww...
2019-01-14 19:47:29
3414
1
原创 基于HTTP服务器实现的在线简历
HTTP服务器的核心流程如下://http_server.c//该文件包含了整个http服务器的实现#include<stdio.h>#include<string.h>#include<stdlib.h>#include<unistd.h>#include<sys/stat.h>#include<sys/...
2018-08-14 09:53:36
804
原创 STL剖析之空间配置器的实现
STL有六大组件:容器、适配器、空间配置器、仿函数、迭代器、算法,这篇博客我主要对空间配置器的简要解析。空间配置器:空间配置器就像是默默工作在其他组件(更准确的说是容器)的背后,一般通常情况下呢?这种默默付出的东西才是人们最应该注意到的东西,才是需要我们要去深入底层去剖析的。我们都知道,整个STL的操作对象都存放在容器之中,而容器一定需要足够的空间去存储这些对象/数据,所以在整个STL的学习中...
2018-08-13 14:04:57
307
原创 搜索结构之平衡树
AVL tree:称为高度平衡的二叉搜索树(左右子树的高度差不超过1),是1962年有俄罗斯的数学家G.M.Adel'son-Vel'skii和E.M.Landis提出来的。它能保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度。AVL树的性质: 1. 左子树和右子树的高度之差的绝对值不超过1 2. 树中的每个左子树和右子树都是...
2018-08-12 13:30:51
405
原创 C++11基础知识点
1998年是C++标准委员会成立的第一年,以后每五年视实际需要更新一次标准,它开发于1998年并于2003年更新,统称为C++98或者C++03,国际标准化组织于2001年9月1号出版发布ISO/IEC 14882:2011,称为C++11。相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C+...
2018-08-11 21:19:37
2264
原创 Huffman Tree应用之文件压缩
Huffman Tree:带权路径长度(从根节点出发到叶子节点)达到最小,称这样的树为哈夫曼树或者最优二叉树。哈夫曼树是带权路径长度最小的树,权值较大的离根近,权值较小的离根远。那么这样一颗树是怎么构建出来的?假设有如下序列元素{1,2,3,4,5,6,7,8,9},先从其中选出两个最小的值作为它的权值(即1,2)作为左右孩子节点,然后把左右孩子之和作为父节点的权值,同时把父节点放到序列中...
2018-08-11 11:43:04
309
原创 C++模板编程之Vector,List,Stack,Queue的实现
1.Vector模板实现#pragma once#include<iostream>#include<assert.h>using namespace std;template<class T>class Vector{public: Vector() :_start(NULL) ,_finish(NULL) ,_endofs...
2018-05-20 14:17:58
327
原创 C++编程之模板与泛型
模板是一种对类型进行参数化的工具,模板是泛型编程的基础,而泛型编程指的就是编写与类型无关的代码,是C++中一种常见的代码复用方式。模板分为模板函数和模板类;模板函数针对参数类型不同的函数;模板类主要针对数据成员和成员函数类型不同的类。简单的提及了模板的概念,那么模板究竟是怎样实现的呢?我们先举一个模板函数的例子,比如在c语言和c++中使用频率相当之高的swap函数,以前我们写的swap函数通常是针...
2018-05-18 08:55:27
2737
原创 C++对象模型之多态
虚函数:在理解多态之前,我们需要先来理解什么叫做虚函数?在成员函数之前冠以关键字“virtual”时,此时这个函数被称之为“虚函数”, 当在子类中定义了一个和父类完全一样的虚函数时,可以称为子类的这个函数重写(或者覆盖了)父类的这个虚函数。简单来说,虚函数使方法在基类和派生类中的行为不同。多态:很多时候,我们希望同一个方法在派生类和基类的行为是不一样的,换句话来说,方法的行为应取决于调用该方法的对...
2018-05-06 13:55:32
149
原创 浅析进程之进程控制
进程:为了能使程序并发执行,并且可以对并发执行的程序加以描述和控制,引入了进程的概念。进程时进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。(并发:一个处理器同时处理多个任务;并行:多个处理器或者多核处理器同时处理多个不同的任务)注意:可执行程序不等同于进程,我们平时所说的某个程序结束了是不严谨的,应该是某个进程结束了。并发和并行的理解图:(此图来源于github)在linux上,我们...
2018-05-02 22:55:35
369
原创 浅析C++中的动态内存分配
在C语言中,我们学到了使用malloc/calloc/relloc来进行内存的动态开辟,用free来完成内存的释放。而在C++中是通过new和delete这两个操作符来实现的。当然C++中也可以使用C语言那套内存管理的方法,毕竟C++是兼容C语言的。一.首先我们来了解一下new和delete的基本语法。int main(){ int* p1=new int;//开辟空间 delete p1;...
2018-04-09 15:28:58
4626
2
原创 浅析C++中的深浅拷贝
浅拷贝:又称值拷贝,将源对象 的值拷贝到目标拷贝对象中去,本质上来说源对象和目标拷贝对象共用一份实体,只是所引用的变量名不同,地址其实还是相同的。举个简单的例子:你的小名叫西西,大名叫沫沫,当别人叫你西西或者沫沫的时候你都会答应,这两个名字虽然不相同,但是都指的是你。假设有一个String类,String s1;String s2(s1);在进行拷贝构造的时候将对象s1里的值全部拷贝到对象s2里。...
2018-04-03 16:06:47
1644
原创 哈希应用变形之位图
位图(bitmap):即用二进制位的状态来判断某个值存不存在,常适用于海量数据问题,用0来表示数据不存在,用1来表示数据存在。例如:
2018-04-02 15:55:45
144
原创 搜索结构之哈希
哈希表:哈希表是一种可以在O(1)时间内查找到某个元素的数据结构,它是用数组实现的,这依赖于内存的随机访问特性。那哈希表到底是什么样呢?哈希表是通过哈希函数(hashfunc)使元素的存储位置与关键码一一对应的关系,所以在进行元素查找的时候可以通过该函数快速的找到该元素。若结构中存在关键字和key相等的元素,则必然存储在f(k)的位置上。由此,不需要进行比较便可以直接取得所查记录。这个对应函数就被...
2018-03-30 15:40:12
298
原创 静态成员,内联,友元,const成员函数
一.静态成员静态成员分为静态成员函数和静态数据成员,是为了实现我们有时候希望有某一个或者几个数据成员为类所定义出来的对象所共有,从而实现一个类多个对象之间的数据共享,如统计总数,平均值等。静态数据成员:若类中的一个数据成员被声明为static,则这个成员为静态数据成员,这个成员为这个类的所有对象所共享。我们需要注意以下几点:1.静态数据成员与普通成员相类似,但在其前面要加上关键字static.2....
2018-03-28 21:53:18
270
原创 快速排序
快速排序:快速排序是对冒泡排序的一种改进,由C.A.R.Hoare在1962年提出。快速排序的基本思想是:先找到一个基准值key,(至于这个key怎么找,我在后面会列出来)。通过一趟排序把待排序序列分为两部分,左边一部分为小于基准值的元素,右边一部分为大于基准值的元素。然后再循环分别对这两部分进行取基准值并排序,所以快速排序实际上是一个递归的过程,可以以此达到使整个序列变为有序序列。我来画一个...
2018-03-27 15:56:08
683
原创 日期类的实现
#include<iostream>#include<assert.h>using namespace std;class Date { public: Date(int year = 1900, int month = 1, int day = 1) :_year(year) //初始化列表 ,_month(month) ,_day(day) ...
2018-03-26 15:37:17
150
原创 C++中默认的成员函数
在C++中,有隐含的this指针,以及6个默认的成员函数。一.this指针首先我们来了解下this指针,1.在C++类中,每个成员函数都有一个默认的指针形参this指针,并且this指针是成员函数的第一个形参,this指针是隐式的(我们在类中声明或者定义成员函数的时候,不需要显式将this指针进行传参),对于我们的构造函数来说比较特殊,不存在这个隐含的this指针。2.编译器会对成员函数进行处理,...
2018-03-24 17:07:30
495
原创 归并排序
1.归并排序归并排序是建立在归并上的一种有效的排序方法,把复杂的问题分解成若干个小文题,是很多复杂问题的 有效解决办法。化繁为简,分而治之。分治法使我们经常会用到的一种方法,归并排序就是采用分治法的一个典型的应用,它是将已经有序的两个区间进行连续归并成一个有效区间,即将两个顺序序列合并为一个顺序序列,我们可以称为二路归并。这个概念可能比较抽象,我们并不能十分清晰的去理解它的排序过程。再来介绍一下归...
2018-03-22 12:14:57
170
原创 堆排序
1.堆排序:提到堆排序,我们先来介绍一下堆,堆从本质上来讲就是一颗二叉树,堆有大堆和小堆之分。大堆指的是每个节点的值都小于它对应的父节点的值,所以在大堆中根节点的值是整个二叉树中值最大的;小堆与大堆刚好相反,即在小堆中,任意一个节点的父节点的值都小于子节点的值,所以在小堆中根节点的值是整颗树中最小的元素。基于堆的这种特性,我们可以很好的去利用它来高效快速的完成排序。堆排序是排序算法中比较常见的一种...
2018-03-21 19:10:09
267
原创 希尔排序
1.希尔排序(ShellSort):又称缩小增量排序,该方法因DL.Shell于1959年提出而得名。前面我们讲了插入排序,那么其实希尔排序就是在插入排序上延伸出来的一种更高效的排序算法,为什么说它更加高效呢?因为其实在元素个数非常少或者元素已经基本有序的情况下插入排序的速度是非常快的。那么究竟什么是希尔排序呢?希尔排序是基本排序算法中的一种,是一种直接插入排序优化后的排序方法,它通过设置步长进行...
2018-03-20 08:46:57
177
原创 直接插入排序
1.直接插入排序:一种比较简单直观的排序算法,将待插入元素找到一个合适的位置并插入到前面的有序序列中。具体实现方法为:每次先用一个临时变量把带插入数据保存起来,然后逐个与前面有序集合里的元素进行比较,如果集合里的元素大于待插入元素(假设我们要从小到大进行排序),就将它向后移动一个单元,直到在有序集合里找到小于等于待插入元素的数时就将待插入元素放在这个数后面。这里,我们依旧用画图的方法来更直观的理解...
2018-03-19 16:34:49
161
原创 选择排序
1.选择排序(SelectSort):选择排序是一种较为简单的排序方法。它是每次在待排序元素中找到最大或者最小的元素,存放在序列的起始位置,直到所有的数据排完为止。如图:从图中我们再来看一下选择排序的过程,假设总共n个元素。首先,第一趟拿初始序列中的第一个元素和后面的元素依次作比较,(以从小到大排序为例)如果大于,就不断进行交换,(当然在不断的交换过程中第一个元素在不断发生改变),最后一次比较完成...
2018-03-18 15:42:34
100
原创 冒泡排序
1.冒泡排序:从头开始依次比较相邻的元素,我们定义为cur和next,如果cur>next,则交换cur和next所指向的元素(假设我们想将n个数从小到大进行排序)。从最开始的一对到最后一对,经过一趟比较便可以找出所有元素中最大的数,此时最大的数就是最后一个元素。然后重复上述步骤,最多经过n-1趟的比较便可以完成排序。如图:2.接下来,我们对冒泡排序进行算法分析时间复杂度:最好情况:所有元素...
2018-03-17 15:28:37
108
原创 指针与引用
1.引用的概念及用法 在C++中,有一种特殊的语法结构叫做引用,那什么叫做引用呢?引用是c++对c语言的一个重要扩充,换句话说,引用就是给某个变量取一个新的别名。引用的语法结构为:类型& 引用名(别名)=目标变量名。例如:int a=0;int& b=a;这条语句的意思为:定义变量a=0,b是变量的别名。在内存中的存储我们可以这样理解:有一块空间,空间里面的内容为0,这个空间的名字...
2018-03-13 15:36:08
251
原创 初学者C++命名空间和函数重载
#include<iostream>包含的是标准的输入输出流,其作用是提供输入输出时的一些信息。一.命名空间:不同于c语言的,C++程序包含了命名空间,其含义为:使用命名空间std.因为C++标准库中的类和函数是定义在命名空间std里的,如果程序要使用C++标准库中的类和函数,就需要声明using namespace std;做提前声明,表示要用到命名空间里的内容。using name...
2018-03-09 15:04:52
456
原创 海量数据处理问题
1.给定一个大小超过100G的文件,其中存在IP地址,找出其中出现次数最多的IP地址。思路:显然我们是不可能将这100G内存直接加载到内存中去处理的。所以我们可以对大文件进行划分,前提当然是相同的IP地址会被划分在一块。假定我们将这个文件分为1024份,那么一个文件的大小大概为100M,然后利用哈希算法对IP地址进行映射,得到的值%1024,将同一个IP地址映射到同一个文件中。然后对每个文件进行处...
2018-03-06 16:47:16
180
原创 c语言实现注释转换(c转为c++)
注释转换目标:将所有的c语言注释变为c++注释测试用例:input.c// this is cpp comment/* int i = 0; *//* int j = 10 */int k = 3;int n = 20;/*int i = 0;int j = 20;int k = 250;*/int q = 9527;/***/
2017-12-03 11:10:53
2548
3
原创 自定义类型(结构体,枚举,联合,位段)
一.结构体c语言提供了两种聚合数据类型,分别为数组和指针,数组是相同类型元素的集合,它的每个元素是通过下标引用或指针间接访问的。结构是不同数据类型的集合,对于结构的访问不能通过下标去访问,因为一个结构的成员可能长度不同。结构并不是它自身成员的数组,结构变量属于标量类型。举例:一个简单的结构声明struct tag{ char a;int b;double c;}x;声明一个变量x,tag...
2017-11-27 21:53:56
164
原创 指针和数组
首先我们先来了解一下指针和数组的基本概念。1.指针是一个地址,int *p=&a,p为指针变量,里面存放了a的地址,因此,将地址形象化的称为指针。2.数组是指一组类型相同元素的集合。3.指针数组: 一个存放指针的数组,其元素均为指针类型数据,也就是说数组中的每个元素都存放地址,相当于一个指针变量。 定义一个指针数组 int *a[5],分析如下:由于[]的优先级比*的高,所以p首先跟[...
2017-11-20 22:14:24
170
原创 可变参数列表
可变参数列表可以让函数在不同的时候接受不同数目的参数,可变参数列表是通过宏来实现的,这些宏定义于stdarg.h头文件,它是标准库的一部分。这个头文件声明了类型va_list和三个宏——va_start,va_arg和va_end,接下来我们通过一个求平均值的函数来观察这三个宏。例子一:#include<stdio.h>#include<Windows.h>#include...
2017-11-11 20:33:28
118
原创 函数的调用及栈帧的创建和销毁
实例代码为:环境为vc++6.0为了研究函数过程调用,我们先来了解几个寄存器,esp:堆栈指针寄存器,指向栈顶。ebp:基址寄存器,指向栈底。eip/ip/pc:程序计数器。程序计数器保存的内容永远是当前正在执行指令的下一条指令的地址。call:在调用函数的时候用。 1.通过修改eip来实现函数的跳转(jmp跳转)。 2.将当前正在执行指令的下一条指令的地址保存起来,以便返回。ret:将当前的...
2017-11-06 13:31:06
242
原创 c语言操作符和表达式
一. 操作符分类:算术操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号表达式下标引用、函数调用和结构成员二.算术操作符+ - * / %1.除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。2.对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。3.%操作符的两个操作数必须为整数。返回的是整除之后的余数。三.移位操作符移位操作...
2017-11-03 12:15:04
196
原创 关于数组名在sizeof内部和在strlen内部
//一维数组int a[]={1,2,3,4};printf("%d\n",sizeof(a));//16,数组名单独放在sizeof内部,表示整个数组,而sizeof求的是字节,所以输出16printf("%d\n",sizeof(a+0));//4,数组名并不是单独放在sizeof内部,则a+0表示下标为0的地址,为数组a首元素的地址,地址大小为4个字节,所以输出4printf("%d\n"...
2017-11-02 20:20:09
224
原创 c语言
//求十个数中的最大值#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main(){int a[10];int max,i;printf("请输入十个数;\n");for(i=0;i<=9;i++) {{ scanf("%d",&a[i]); max=a[0];}for(i=0;i<=9;i+...
2017-10-08 15:28:58
165
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人