自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(66)
  • 资源 (3)
  • 收藏
  • 关注

转载 算法思想:动态规划

动态规划比较适合用来求解最优问题,比如求最大值、最小值等等。它可以非常显著地降低时间复杂度,提高代码的执行效率。不过,它也是出了名的难学。它的主要学习难点跟递归类似,那就是,求解问题的过程不太符合人类常规的思维方式。对于新手来说,要想入门确实不容易。不过,等你掌握了之后,你会发现,实际上并没有想象中那么难。0-1 背包问题对于一组不同重量、不可分割的物品,我们需要选择一些装入背包,在满足背包最...

2019-08-05 15:35:51 315

转载 算法思想:回溯法

很多经典的数学问题都可以用回溯算法解决,比如数独、八皇后、0-1 背包、图的着色、旅行商问题、全排列等等。笼统地讲,回溯算法很多时候都应用在“搜索”这类问题上。不过这里说的搜索,并不是狭义的指我们前面讲过的图的搜索算法,而是在一组可能的解中,搜索满足期望的解。回溯的处理思想,有点类似枚举搜索。我们枚举所有的解,找到满足期望的解。为了有规律地枚举所有可能的解,避免遗漏和重复,我们把问题求解的过程...

2019-08-05 14:22:17 655

转载 算法思想:分治算法

分治算法(divide and conquer)的核心思想其实就是四个字,分而治之 ,也就是将原问题划分成 n 个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。这个定义看起来有点类似递归的定义。关于分治和递归的区别,我们在排序(下)的时候讲过,分治算法是一种处理问题的思想,递归是一种编程技巧。实际上,分治算法一般都比较适合用递归来实现。分治算法...

2019-08-05 14:16:45 320

转载 算法思想:贪心算法

关于贪心算法,我们先看一个例子。假设我们有一个可以容纳 100kg 物品的背包,可以装各种物品。我们有以下 5 种豆子,每种豆子的总量和总价值都各不相同。为了让背包中所装物品的总价值最大,我们如何选择在背包中装哪些豆子?每种豆子又该装多少呢?实际上,这个问题很简单,我估计你一下子就能想出来,没错,我们只要先算一算每个物品的单价,按照单价由高到低依次来装就好了。单价从高到低排列,依次是:黑豆、...

2019-08-05 11:48:08 366

原创 如何快速获取到Top 10最热门的搜索关键词?

因为用户搜索的关键词,有很多可能都是重复的,所以我们首先要统计每个搜索关键词出现的频率。我们可以通过散列表、平衡二叉查找树或者其他一些支持快速查找、插入的数据结构,来记录关键词及其出现的次数。假设我们选用散列表。我们就顺序扫描这 10 亿个搜索关键词。当扫描到某个关键词时,我们去散列表中查询。如果存在,我们就将对应的次数加一;如果不存在,我们就将它插入到散列表,并记录次数为 1。以此类推,等遍历...

2019-08-05 10:43:45 1458

原创 代码简洁之启发

1.函数F1: 过多的参数函数的参数量应该少。没参数最好,一个次之,两个、三个再次之。三个以上的参数非常值得质疑,应坚决避免。F2: 输出参数输出参数违反直觉。读者期望参数用于输入而非输出。如果函数非要修改什么东西的状态不可,就修改它所在对象的状态好了。F3: 标识参数布尔值参数大声宣告函数做了不止一件事。它们令人迷惑,应该消灭掉。2.重复每次看到重复代码,都代表遗漏了抽象。重复的...

2019-08-05 10:14:41 152

原创 代码简介之类

1. 类的组织类应该从一组变量列表开始。如果有公共静态常量,应该先出现。然后是私有静态变量,以及私有实体变量。很少会有公共变量。公共函数应跟在变量列表之后。类应该短小关于类的第一条规则是类应该短小。第二条规则是还要更短小2.单一权责原则单一权责原则(SRP) 认为,类或模块应该有且只有一条加以修改的理由。该原则既给出了权责的定义,又是关于类的长度的指导方针。类只应有一个权责一只有一条修改...

2019-08-05 09:01:48 310

原创 代码简洁之注释

1. 注释不能美化糟糕的代码写注释的常见动机之一是糟糕的代码的存在。我们编写一个模块,发现它令人困扰、乱七八糟。我们知道,它烂透了。我们告诉自己:“喔,最好写点注释!”不!最好是把代码弄干净!带有少量注释的整洁而有表达力的代码,要比带有大量注释的零碎而复杂的代码像样得多。与其花时间编写解释你搞出的糟糕的代码的注释,不如花时间清洁那堆糟糕的代码。2. 好注释法律信息提供信息的注释对意图的...

2019-08-04 18:25:28 188

原创 代码整洁之函数

1. 短小函数的第一规则是要短小。第二条规则是还要更短小。每个函数都只说一件事。而且,每个函数都依序把你带到下一个函数。这就是函数应该达到的短小程度!代码块和缩进if 语句、else 语句、while 语句等,其中的代码块应该只有一行。该行大抵应该是一个函数调用语句。这样不但能保持函数短小,而且,因为块内调用的函数拥有较具说明性的名称,从而增加了文档上的价值。这也意味着函数不应该大到足以容...

2019-08-04 17:01:17 147

原创 代码整洁之命名

1. 名副其实变量、函数或类的名称应该已经答复了所有的大问题。它该告诉你,它为什么会存在,它做什么事,应该怎么用。如果名称需要注释来补充那就不算是名副其实。2. 避免误导程序员必须避免留下掩藏代码本意的错误线索。应当避免使用与本意相悖的词。例如,hp 、aix 和sco 都不该用做变量名,因为它们都是UNIX 平台或类UNIX 平台的专有名称。别用accountList 来指称一组账号,除...

2019-08-04 15:56:25 117

原创 算法题:25匹马,找出最快的3匹,最少需要多少次比赛

笔试题:25匹马,找出最快的3匹,但是只有5个赛道,每次比赛只能得到5匹马的速度排序,那么最少需要多少次比赛答案:7分析:1-5 场:将25匹马分为5组,每组5匹,得到下面的排序,每组最快的马在左侧,即X1、X6、X11、X16、X21分别是每组中最快的。组1:X1 X2 X3 X4 X5组2:X6 X7 X8 X9 X10组3:X11 X12 X13 X14 X15...

2019-07-29 12:57:23 6659 1

原创 算法题:求两个字符串的最长公共子串

问题:有两个字符串str和str2,求出两个字符串中最长公共子串长度。比如:str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最长公共子串长度为5。算法思路:1、把两个字符串分别以行和列组成一个二维矩阵。2、比较二维矩阵中每个点对应行列字符中否相等,相等的话值设置为1,否则设置为0。3、通过查找出值为1的最长对角线就能找到最长公共子串。针...

2019-07-27 08:01:29 1124

原创 算法题:用一个骰子生成1到7的随机数

解法1:将一个筛子扔两次可以得到36种组合,每五种组合代表一个数字,剩下的一种表示重扔。第一步:将这个筛子扔两次,假设第一次扔的时候得到a,第二次是b,表示为(a, b)。第二步:1: (1, 1), (1, 2), (1, 3), (1, 4), (1, 5)2: (1, 6), (2, 1), (2, 2), (2, 3), (2, 4)3: (2, 5), (2, 6), (3...

2019-07-22 11:00:24 4091

原创 C++单例模式实现

简述单例模式(Singleton Pattern)是设计模式中最简单的形式之一,其目的是使得类的一个对象成为系统中的唯一实例。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一对象的方式,可以直接访问,不需要实例化该类的对象。要点单例模式的要点有三个:单例类有且仅有一个实例单例类必须自行创建自己的唯一实例单例类必须给所有其他对象...

2019-07-22 10:57:41 166

原创 客户服务器设计范式

当开发—个Unix服务器程序时,我们有如下类型的进程控制可供选择。迭代服务器(iterative server) 程序:不过这种类型的适用情形极为有限,因为这样的服务器在完成对当前客户的服务之前无法处理已等待服务的新客户。基于多进程的并发服务器(concurrent server) 程序,它为每个客户调用fork派生一个子进程。传统上大多数Unix服务器程序属于这种类型。基于I/O复用的迭代...

2019-07-19 07:58:47 235

原创 常用GDB调试命令

查看当前运行到哪:查看堆栈 bt --打印当前的函数调用栈的所有信息。查看当前栈帧的信息:f --栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。一个进程对应call-stack调用栈,一个函数对应stack-frame栈帧组合多个变量 {var1, var2, var3 }info args --打印...

2019-07-14 16:23:56 153

原创 http和https区别

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,H...

2019-07-14 16:18:24 139

原创 TCP连接意外中断

如何及时有效地检测到一方的非正常断开,一直有两种技术可以运用。一种是由TCP协议层实现的Keepalive,另一种是由应用层自己实现的心跳包。TCP默认并不开启Keepalive功能,因为开启Keepalive功能需要消耗额外的宽带和流量一。服务器进程终止:建立连接以后用kill杀死服务器进程,作为进程终止处理的部分工作,子进程中所有打开着的描述字都被关闭。这就导致向客户发送一个FIN,而客户...

2019-07-14 16:13:47 3839

原创 libevent事件处理框架:event_base

回想Reactor 模式的几个基本组件, 本节讲解的部分对应于Reactor 框架组件。在libevent中,Reactor 框架组件表现为event_base结构体,结构体声明如下,它位于event-internal.h 文件中:struct event_base {const struct eventop * evsel ;void * evbase;int event_count ;...

2019-07-14 16:10:53 312

原创 libevent 核心:事件 event

libevent 的核心-eventLibevent 是基于事件驱动( event-driven )的,从名字也可以看到event 是整个库的核心。event 就是Reactor 框架中的事件处理程序组件;它提供了函数接口,供Reactor 在事件发生时调用,以执行相应的事件处理,通常它会绑定一个有效的句柄。首先给出event 结构体的声明,它位于event.h 文件中:struct eve...

2019-07-14 16:07:13 321

原创 Libevent学习笔记-Reactor 模式

Libevent 是一个轻量级的开源高性能网络库,由c语言编写。跨平台,支持Windows 、Linux 、*BSD 和Mac Os;支持多种I/O 多路复用技术, epoll、poll 、dev/poll 、select 和kqueue 等;支持I/O ,定时器和信号等事件;注册事件优先级;理解Reactor 模式是理解libevent的基石Reactor 模式普通函数调用的机制:...

2019-07-14 16:04:19 161

原创 1~n整数中1出现的次数(基于每一位出现次数求和解法)

算法题目: 输入一个整数n, 求1 ~ n 这n 个整数的十进制表示中1 出现的次数。例如,输入12, 1~12 这些整数中包含1的数字有1 、10 、11 和12, 1 一共出现了5 次。直观解法:直观解法,遍历从1到n,分别对每个数字含有的1个数求和 分析数字解法分析数字,分别计算每一位1出现的次数分析规律:首先对某一位的几个变量权值 p:个位权值为1,十位权值为10,百位权值...

2019-05-21 19:20:40 474

原创 c++使用vector建立最大堆和最小堆

1. 建堆vector<int> nums={6, 9, 2, 4, 7, 0, 1, 8, 3, 5};构建最大堆make_heap(nums.begin(), nums.end());//ormake_heap(nums.begin(), nums.end(), less<int>());输出nums的结果为9 8 2 6 7 0 1 4 3 5 ...

2019-05-20 17:15:44 740

转载 进程,线程相关概念和面试题

1.什么是进程?什么是线程?进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。在Mac、Windows NT等采用微内核结构的操作系统中,进程的...

2019-04-03 10:12:09 615

原创 .vimrc自定义之一键编译运行

在linux系统利用vim写程序中如何像windows系统下vs一样一键编译运行代码呢在 .vimrc文件中添加如下代码map后尖括号为运行键由于我主要编写c++程序,且我的目录结构为:原代码主要是针对单一程序所使用,所以我针对c++那句进行了改编,可以根据自己的程序目录结构结合下面的目录符号表示方法改写适合自己的运行函数map <F4> :call CompileRunG...

2019-03-23 16:12:05 837

原创 libsvm在vs2017下使用c++实例详解(含c++代码)

最近有项目需要利用svm进行光谱数据分类,所以使用了libsvm实现了该分类器,并且效果不错相关参考环境搭建首先下载libSVM最新的版本使用VS2017创建一个新的空工程,把上图目录中的svm.cpp和svm.h复制到工程目录下,把这两个文件添加到工程中去。注意:VS2017中使用fopen会出现一个错误,原因是VS2017自身兼容性不好,认为fopen不安全,可以通过 工程右键——...

2019-03-23 09:45:25 5030 2

原创 STL::iterator迭代器分类

1. 输入迭代器:只读,一次传递为输入迭代器预定义实现只有istream_iterator和istreambuf_iterator,用于从一个输入流istream中读取。一个输入迭代器仅能对它所选择的每个元素进行一次解析,它们只能向前移动。一个专门的构造函数定义了超越末尾的值。总是,输入迭代器可以对读操作的结果进行解析(对每个值仅解析一次),然后向前移动。2. 输出迭代器:只写,一次传递...

2019-03-17 09:03:00 224

原创 STL::iterator迭代器

迭代器是一种泛化的指针。iterator遵循的原则:因为迭代器是算法连接容器的桥梁,算法通过迭代器操作容器实现算法的目标。所以算法有时需要去了解迭代器的特征(trait)来更好的使用迭代器。不同容器的迭代器都需要声明5个特征供算法查询:_List_iterator内的5个 特征声明:算法内获取迭代器特征的方法:当迭代器I是一个class时可以直接获取萃取机 traits:问题...

2019-03-17 08:41:44 210

原创 STL算法algorithm

STL算法部分主要由头文件,,组成。要使用 STL中的算法函数必须包含头文件,对于数值算法须包含,中则定义了一些模板类,用来声明函数对象。STL中算法大致分为四类:非可变序列算法:指不直接修改其所操作的容器内容的算法。可变序列算法:指可以修改它们所操作的容器内容的算法。排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。数值算法:对容器内容进行数值计算。查找...

2019-03-17 08:22:23 640

原创 STL::hashtable

hashtable是stl内一个非公开的类:其是c++11中新加入的unordered container容器的底部实现。包括: unordered_set, unordered_multiset, unordered_map, unordered_multimap.为了防止某个单向链表太长,当元素个数等于buckets vector长度时,buckets vector长度扩展为靠近...

2019-03-17 00:33:00 231

原创 STL::rb_tree红黑树以及set,map

红黑树是平衡二分搜索树。其元素排列规则有利于查找和插入。红黑树提供遍历操作及iterator,按照it++遍历能得到排序的状态。不应该使用iterator改变元素值,会打乱其排列规则。红黑树是set和map的底部支持。STL红黑树类(非公开容器)Key是键的类型,Value是值(key和data的结合)的类型 ,KeyOfValue是如何将key从value中取出(函数对象),...

2019-03-17 00:26:12 397

原创 STL::deque以及由其实现的queue和stack

deque双向队列,可在头尾插入和删除。存储方式:在内存中分段连续。其iterator的功劳:当迭代器指到一个buffer的边界时会进行判断,有能力跳入下一个或者前一个buffer,形成连续的假象(模拟连续储存)。GNU2.9 中deque模板含三个参数,允许指定buffer大小(GNU4.53以后不再允许)第三个参数为缓冲区大小,默认值为0表示使用预设值,若为n(n!=0)则表示每个...

2019-03-17 00:06:09 914

原创 STL::list源码及实现

GNU 2.9中:一个list中数据部分只含有一个名为node指向 __list_node&lt;T&gt;的指针。lsit在空间储存不连续,为了实现iterator的++等运算,将iterator设计为class而不仅仅是一个指针。iterator类内也含有一个名为node指向 __list_node的指针。该class要模拟指针,有大量的操作符重载(++,–,*,-&gt;等)。...

2019-03-16 23:43:48 723

原创 STL::vector源码及函数

vector是一种动态增长的数组。GNU 2.9一个vector中所含的数据为三根指针 start, finish, end_of_storage所以sizeof()一个vector值为12。(一个指针占4位)满足前闭后开区间原则,start指向第一个元素,finish指向最后一个元素的下一位。空间二倍增长:发生在添加元素时当finish==end_of_storage,利用辅助插入函...

2019-03-16 10:27:01 517

原创 STL::array

array定义对象时需要同时指定类型和长度。长度指定后不能改变。若指定长度为0则会默认改为1:array没有构造和析构函数。array直接使用指针当迭代器: ...

2019-03-16 10:11:51 515

原创 STL容器container

容器分类:序列式容器(array, vector, deque, list, forward-list),关联式容器(set/multiset, map/multimap,unordered containers)GNU2.9版中容器多写为一个单一的类模板,较为简明,容易理解。GNU4.9版中容器变成了有复杂继承和复合(包含)关系的类模板,不易理解。...

2019-03-16 09:58:57 535

原创 STL分配器allocator

分配器为为容器再内存中分配空间。容器的一般默认分配器是 std::allocator ,该分配器是一个类模板。对内存空间分配的动作(分配器,new,operator new()等)一般最后都会调用malloc() 。malloc() 再根据不同的操作系统调用其底层的API。同理释放内存对应的free()。malloc(size)分配的内存:除了要求的size意外malloc(size)还...

2019-03-16 09:46:10 724

原创 c++STL基础

C++ standard library:C++ 标准库STL (standard template library) :标准模板库 (C++标准库的主要部分)标准库以头文件形式呈现c++标准库的头文件可以不带副名(.h): #include &amp;lt;vector&amp;gt;新式的c头文件也可以不带副名(.h),前面加个字母c: #include&amp;lt;cstdio&amp;gt;旧时的c头文件...

2019-03-16 08:57:31 250

原创 c++编译期多态与运行期多态,显示接口和隐式接口

运行期多态(runtime polymorphism)运行期多态的设计思想要归结到类继承体系的设计上去。对于有相关功能的对象集合,我们总希望能够抽象出它们共有的功能集合,在基类中将这些功能声明为虚接口(虚函数),然后由子类继承基类去重写这些虚接口,以实现子类特有的具体功能。典型地我们会举下面这个例子:运行期多态的实现依赖于虚函数机制。当某个类声明了虚函数时,编译器将为该类对象安插一个虚函数...

2019-03-16 08:32:25 323

原创 c++类型转换

c风格的类型转换:TYPE a=(TYPE)b;但是c 风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向非 const对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的指针,这两种转换之间的差别是巨大的,但是传统的c语言风格的类型转换没有区分这些。c++提供的4种类型转换1.stati...

2019-03-15 16:12:29 160

深入理解计算机系统

深入理解计算机系统,第三版,高清版,网盘连接及提取码神书你值得拥有

2018-10-11

putty 在windows操作系统下连接远程linux系统

适合用于控制云主机等在windows操作系统下连接远程linux系统

2018-07-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除