自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

silence1772的博客

为者常成,行者常至

  • 博客(25)
  • 收藏
  • 关注

原创 Linux内核简单分析(2)——进程调度与切换

进程的调度与切换是一个很复杂的话题,这里我更关心内核是如何实现的,而不是使用了什么策略,所以只讲进程的组织和切换方式,而对调度程序的实现和算法不作分析。如何组织进程?回顾一下进程的task_struct结构,在里面有一个struct list_head run_list;字段,内核通过这个run_list将处于TASK_RUNNING状态的进程连成一个链表,而处于睡眠状态的进程则处于另一个等待...

2019-04-15 15:23:04 732

原创 Linux内核简单分析(1)——进程管理

何为进程?许多的内核书籍都会把进程放在比较靠前的章节介绍,因为进程是内核中一个比较重要的概念,很多东西都是围绕进程来展开的,毕竟系统的任务就是运行进程嘛,这里我也把进程放到最前面来介绍。进程的概念学过操作系统的都懂,比较字面的解释也就不说了,进程一般是一个正在运行的程序,它还包括这个进程所拥有的资源,比如打开的文件,CPU寄存器里面的数据,进程所拥有的地址空间(例如申请的变量,堆和栈等)。从...

2019-04-09 19:02:50 437

原创 C++11线程池简洁实现

C++11标准里新增了多线程库,可以有效简化多线程代码的编写。下面的代码是基于C++11的线程池实现,原理也很简单,类似于生产者消费者,即有n个线程,相当于消费者,还有一个任务队列,相当于生产者。当任务队列被塞入任务时,线程们就去竞争这些任务,但每次只有一个线程能够得到任务。下面来说说具体的实现,首先任务的类型就是一个没有参数,返回值为void的函数,使用using Task = std::fu...

2019-01-31 21:04:16 1516 1

原创 红黑树

红黑树是一种特殊的二叉搜索树,

2018-11-07 20:02:50 234

原创 二叉搜索树及AVL平衡二叉搜索树

二叉搜索树二叉搜索树是二叉树的的一种,只不过多了个限制条件,即左子树节点的值都小于该点,右子树节点的值都大于该点。定义:// 树节点template <typename T>class Node{public: T key; Node* parent; Node* left; Node* right; Node(T k, Node* p = nullptr,...

2018-11-06 13:39:54 214

原创 并查集

并查集的实现比较简单,注意一点在查找时执行路径压缩即可。vector<int> Parent(100);vector<int> Rank(100, 0);void Init(){ for (int i = 0; i < Parent.size(); ++i) Parent[i] = i;}int Find(int x){ if (x != P...

2018-11-04 16:52:19 113

原创 KMP字符串匹配算法

“看毛片”算法可以说是许多人学习数据结构路上的一道坎,虽说代码并不算难,但总是写了就忘,其算法思想也是难以理解。其实多写几遍就会发现,也就那么回事。主要思想:kmp算法主要是通过一个next数组来加速匹配的过程,这个next数组也称为失配数组。现在我们来考虑下面这种情况,母串与匹配串匹配到了如图箭头位置,但此时A和B并不匹配,怎么办呢?注意到图中蓝色部分是相等的子串,因此我们直接移动匹配串让A...

2018-11-04 14:42:01 147

原创 二分查找

二分查找主要思想就是在一个排好序的数组中,取到位于中间的元素,根据这个元素与要查找的值进行比对,来判断是往左边走还是右边。时间复杂度为O(logn),是许多题目的解题关键。三分支版传入数组的起始和结束边界,以及要查找的值,查找到则返回下标,否则返回-1,因为最坏情况下要进行两次比较,所有时间复杂度的常数项稍微高一点。int BinarySearch(vector<int>&amp...

2018-11-03 23:25:32 121

原创 二叉树的Morris遍历

二叉树的普通遍历算法有很多,但它们都无法做到额外空间复杂度O(1),因为它们总要用到栈来保存信息,才能够从下层回到上层。这里介绍Morris遍历,能够做到时间复杂度为O(n),额外空间复杂度为O(1)。Morris中序遍历Morris遍历其实就是利用了树中大量的null指针。如下图,我们现在先来考虑中序遍历,对于节点4,什么时候会打印它呢?由中序遍历的序列得知,在节点4的左子树都打印完毕后,...

2018-11-03 13:34:14 325

原创 二叉树各种遍历算法

#include <iostream>using namespace std;struct Node{ int value; struct Node* left; struct Node* right; Node(int data) : value(data), left(nullptr), right(nullptr) {};};// 先序遍历void Pre...

2018-11-01 22:15:12 20440 1

原创 桶排序、基数排序

桶排序主要思想:对于输入的数据(大小范围为0~max),创建0到max个桶,第一步装桶:遍历数据,将与元素值相等的桶计数加1;第二步收集:遍历桶,如果桶计数n不为0,则在原数组中增加n个与桶标号相等的数。代码:// 需传入数据中的最大值void BucketSort(vector<int>& a, int max){ int n = a.size(); int ...

2018-10-31 23:50:08 164

原创 选择、冒泡、归并、插入及希尔排序

选择排序选择排序每次遍历一遍数组,找出最小的数,然后跟数组的第一个元素交换。再从剩下的元素中重复此步骤直至数组排序完毕。时间复杂度与输入数据无关,为O(n^2)。代码:void SelectSort(vector<int>& a){ int n = a.size(); for (int i = 0; i < n - 1; ++i) { int min ...

2018-10-30 23:16:37 136

原创 堆排序

基本思想堆排序是利用二叉堆实现的一种排序算法,它的最好、最坏、平均时间复杂度均为O(nlogn),为不稳定排序,可实现就地排序,额外空间复杂度为O(1)。先了解一下堆的结构。堆本质上是完全二叉树,分为大顶堆和小顶堆,每个结点的值都大于或等于左右孩子的称为大顶堆,反之为小顶堆。【图】下面我们都以大顶堆为例。将该二叉堆结构按照层次遍历的次序映射到数组中,则该数组逻辑上也是一个堆。【图】对于...

2018-10-29 22:44:51 288

原创 快速排序

快速排序快速排序基于分治策略,时间复杂度最好O(nlogn),最差O(n^2),平均O(nlogn),为不稳定排序。算法思想:选取一个数作为轴点,然后把小于轴点的元素移到左边,大于轴点的移到右边,接着递归处理左右两部分,最终处理完毕的数组即为排序后的数组。...

2018-10-29 13:18:40 133

原创 C++网络编程实战项目--Sinetlib网络库(5)——HTTP服务器设计与实现

Sinetlib内嵌了一个简易的HTTP服务器,实现了url匹配和静态资源访问,可以使用作为RESTful API的后台。整体架构整体是建立在网络库连接的抽象上的,但服务器接收到消息,将其解析成HTTP Request,然后通过路由器进行匹配,得到匹配的Hander进行处理,如果没有匹配则直接返回404 Response。处理完生成对应的Response发送回去。解析对于http请求的解...

2018-10-26 22:27:06 2064

原创 C++网络编程实战项目--Sinetlib网络库(4)——线程池和整体框架

线程池我们已经有了一个Looper类表示事件循环,且每个线程只能有一个Looper,现在我们把Looper和线程绑定在一起,成为一个新的类LooperThread创建该类也就创建了一条新线程,然后该线程上运行着Looper。我们把这些线程都交由线程池管理,也就是ThreadPoolReactor实际上这并不是纯粹的Reactor模式,更应该称之为半同步半异步模式。我们有一个主线程以及线程...

2018-10-25 14:34:01 1348

原创 C++网络编程实战项目--Sinetlib网络库(3)——事件循环与跨线程调用

上一篇文章讲了Reactor模式的关键结构I/O复用和事件分发,现在我们来关注一下它们的使用。事件循环我们已经实现了一个Epoller类来实现I/O复用,具体的使用方法就是Epoller::Poll()函数等待事件的发生,该函数有一个超时时间,超过这个时间即使没有事件发生也会返回,那么我们如何让它一直工作呢?很明显就是使用while循环。一个事件循环的大概逻辑如上图,就是循环反复地调用Po...

2018-10-24 13:30:15 2510 3

原创 C++网络编程实战项目--Sinetlib网络库(2)——I/O复用与事件分发

从这一节开始讲解网络库代码的实现,在触及完整的运行逻辑之前,我们先来了解底层的Reactor模式关键结构。事件分发让我们先理清一下事件分发的概念。在linux系统中,信奉着一切皆文件的思想,对于我们网络库使用的socket套接字,也是用文件描述符来表示。现在假设我们有一个socket,这个socket连接了一个客户机,那么现在我们想象出下面这一场景:可以看到,socket相当于一个听筒,客户...

2018-10-23 20:33:08 1287

原创 C++网络编程实战项目--Sinetlib网络库(1)——概述

前言这个网络库是我一直想完成的一个个人项目,到现在也只能说完成了基础的一部分,还有很多功能没完成。因为想往linux c++后台方向发展,所以就打算实现一个网络库,来串联学到的知识,包括APUE、UNP、《Effevtive C++》等等可以说是该方向必看的书籍。暑假的时候我照着陈硕先生的muduo网络库模仿了一个,学到了很多,但对很多细节不解,所以现在就想重新实现,同时也熟悉整个开发流程。项...

2018-10-22 21:03:32 3461 1

原创 Vim常用命令及配置方案

几句话很久之前就接触到vim,初学那阵觉得vim很酷炫,但确实对新手不是很友好。我也就简单看了下基本操作就上手了,但又不是长期在vim下工作,这就导致了每一次重新使用vim都要再去回温下基本操作,很是难受,所以就趁这个机会把基本操作都记录下来,一来可以当做自己的笔记,二来希望可以帮到同样和我一样用过vim但却忘得差不多的人。另外,这里也记录一下自己的vim配置,这个配置可能并没有其他网友分享的...

2018-07-16 12:59:18 3033

原创 Java魔板游戏完整代码及注释

魔板游戏Javafx版类九宫格、华容道游戏,项目地址:https://github.com/silence1772/Java-Npuzzle(记得点star啊,收藏一个项目最好的方式是star而不是fork)游戏下载:魔板游戏.exe                 魔板游戏.jar游戏截图:几句话:这个游戏跟上一个游戏一样,同样是用来当作业上交的,不过这个相比之前那个简洁很多,阅读体验也比较好,...

2018-03-25 22:51:24 4870 2

原创 贪吃蛇大作战JavaFx版完整源码

贪吃蛇大作战 Java版项目源码:https://github.com/silence1772/JavaFX-GreedySnake(记得点star啊,收藏一个项目最好的方式是star而不是fork)游戏下载:贪吃蛇大作战.exe                 贪吃蛇大作战.jar游戏截图:几句话:这个游戏是去年写的,用来交数据结构作业的,本来在大一暑假时我就开始写,那时老师还没提具体要求,我就...

2018-03-25 21:07:20 14654 2

原创 腾讯云Ubuntu14.04搭建机器学习环境(jupyter和numpy,scipy,matplotlib,pandas,scikit-learn)

搭建一个机器学习云端服务器前言手头上有台云服务器,一直闲置着,刚好最近想看一看机器学习方面的内容,在自己机子上搞又不是很方便,所以就想着利用这个搭个服务器来跑跑,废话不多说,开搞。开始首先你要拥有一台云服务器,我这里用的是腾讯云提供的CVM,操作系统是ubuntu 14.04。 本文介绍的是基于python3.4的配置,如果是python2.x请自行斟酌。首先先安装python3和python-pip以及pyt

2017-09-27 23:20:08 1678

原创 c++经典项目控制台贪吃蛇小游戏详细教程

贪吃蛇GreedySnake本文将讲解如何使用c++面向对象方法编写控制台版贪吃蛇小游戏,项目github地址:silence1772/GreedySnake 游戏下载:GreedySnake 本人属初学者,水平所限,难免有所错误及不妥之处,劳请指出或发表意见,本人定当及时加以改正。本文所有代码在code::blocks使用c++11标准编译通过,未测试在其它环境下使用情况游戏截图 开

2017-02-12 21:05:19 93692 76

原创 前言

关于我的博客最近看了很多人的博客,发现写博客是一个好习惯,能将很好锻炼自己的书面表达能力,同时也能将学习的点点滴滴记录下来,有苦苦钻研很久都想不出然后突然灵光一现的那种喜悦,也有看着自己努力良久写出的一大堆代码的成就感。虽说自己水平渣渣,但也不能以渣为借口而不去上进,就像看过的一句话:如果可以,每个人都愿意走向优秀!当你下定了决心时,就意味着要比别人付出更多!感触颇深,就让这句话作为我的开始吧!

2016-10-24 23:12:05 447

空空如也

空空如也

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

TA关注的人

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