- 博客(43)
- 收藏
- 关注
原创 一致性哈希算法
什么是一致性哈希一致哈希 是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对K/n个关键字重新映射,其中K是关键字的数量,n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。一致性哈希的特点平衡性平衡性是指哈希的结果能够尽可能分布到所有缓冲去,这样可以使得付哦有的缓冲空间都使得 所有的缓冲空间得到利用。单调性单调...
2019-02-13 16:54:49
222
原创 【剑指】 面试题58 翻转单词顺序
第一步翻转句子中所有字符,第二步翻转单词void Reverse(char* pBegin, char* pEnd) //反转字符串{ if (pBegin == NULL || pEnd == NULL) return; while (pBegin < pEnd) { char temp = *pBegin; *pBeg
2017-09-04 20:33:30
222
原创 【剑指】面试题50 字符串中第一个只出现一次的字符
算法思想 我们可以考虑实现一个简单的哈希表,字符是一个长度为8的数据类型,因此共有256中可能。于是我们创建一个长度为256的数组,每个字母根据其ASCII吗值作为数组的下标对应数组的一个数字,而数组中存储的每个字符出现的次数,这样我们创建了一个大小为256、以字符ASCII码值为键值的哈希表 char FirstNotRepeatingChar(string str
2017-09-04 20:08:31
245
原创 【剑指offer】面试题39 数组中出现次数超过一半的数字
解法一:基于Partition函数的时间复杂度为O(n) 算法思想:如果将数组排序,排好序的之后位于中间的数字一定就是出现次数超过一半的的数字。也就是说,这个数字是统计学上的中位数 利用快速排序的思想实现此类算法。代码如下: bool g_bInputInvalid = false;bool CheckInvalidArray(int* number, int leng
2017-09-04 19:47:13
308
原创 【计算机网络 】计算机网络体系结构
一、计算机网络的定义 计算机网络是一些相互连接、自治的计算机的结合 二、常用计算机计算机网络体系结构 OSI七层体系结构:应用层、会话层、表示层、传输层、网络层、数据链路层、物理层 TCP/IP四层体系结构:应用层、运输层、网际层、网络接口层 五层体系结构:应用层、传输层、网络层、数据链路层、物理层 三、各层主要功能
2017-08-31 14:36:00
389
原创 【压缩算法】LZ77算法
一、算法介绍LZ77算法是采用自适应的字典模型,也就i是将已经编码的信息作为字典,如果要编码的字符曾经出现过,就输出该字符串的出现位置以及长度,否则输出新的字符串。二、算法思想它的核心思想是在前面已经出现过的数据中找重复出现的字符,根据局部性原理,入股一个字符串要重复,那么也实在附近重复,远的地方就不要找了,因此设置一个滑动窗口,每次都在这个窗口里面找重复出现的字符。关于这个滑动窗口的大小,理论上是
2017-08-21 14:37:22
10338
原创 二叉树前、中、后非递归遍历
//中序遍历void InOrderWithoutRecursion1(BTNode* root){ //空树 if (root == NULL) return; //树非空 BTNode* p = root; stack<BTNode*> s; while (!s.empty() || p) { //一直遍
2017-08-10 16:42:05
225
原创 模拟实现atoi函数
using namespace std; typedef enum Myenum{ VALID//feifa ,INVID//hefa}Status ; Status stat = INVID;int my_atoi(const char* string) { int Ret_sign = 0; int Integet_sign = 1; lon
2017-08-08 16:32:59
166
原创 模拟实现C库的memcpy和memmove。
memcpy c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。 函数原型void* memcpy(void* dest,const void *src, size_t n);void* my_memcpy(void* dest, const void* src, size_t n){ as
2017-08-08 16:26:39
190
原创 简单的布隆过滤器
原理当一个元素被加入集合时,通过 K 个 Hash 函数将这个元素映射成一个位阵列(Bit array)中的 K 个点,把它们置为 1。检索时,我们只要看看这些点是不是都是 1 就(大约)知道集合中有没有它了:如果这些点有任何一个 0,则被检索元素一定不在;如果都是 1,则被检索元素很可能在。优点它的优点是空间效率和查询时间都远远超过一般的算法,布隆过滤器存储空间和插入 / 查询时间都是常数O
2017-08-08 16:12:15
288
原创 微型http服务器
一、HTTP协议的主要特点支持客户/服务器模式简单快速:客户向服务器请求服务时,只需传送请求方法和路径。灵活:HTPP允许传输任意类型的的数据对象。无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面
2017-07-18 09:38:33
1414
原创 负责链表的复制
//复杂链表的复制//链表定义struct ComplecListNode{ int m_nValue; ComplecListNode* m_nNext; ComplecListNode* m_npSibling;};//复制结点/*根据原始链表的每个结点N创建对应的N‘。把N’放到N的后面*/void CloneNode(
2017-07-17 15:35:54
171
原创 删除不带头结点的单链表的非尾结点&&逆序打印单链表
//链表定义typedef struct Node{ Node(const int& value) : m_value(value) , m_pNext(NULL) {} int m_value; Node* m_pNext;}Node, *pNode;//删除无头单链表的非尾结点//要删除的结点如果是头节点或者尾结点则不删除void
2017-07-17 15:03:38
163
原创 1.判断两个链表是否相交,若相交,求交点。(假设链表不带环)2.判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】
//链表定义typedef struct Node{ Node(const int& value) : m_value(value) , m_pNext(NULL) {} int m_value; Node* m_pNext;}Node, *pNode;//判断链表是否相交 不带环/*算法思想:因为相交之后的部分长度是相等的,所以我们让
2017-07-16 11:35:59
371
原创 设计一个类不能被继承 2.设计一个类只能在堆上创建对象。 3.设计一个类只能在栈上创建对象
//1 只能在堆上创建对象class HeapOnly{public: static HeapOnly* CreateInstance() { HeapOnly* obj = new HeapOnly; obj->m = 2; return obj; } static void DeleteInstance(Heap
2017-07-16 10:44:57
246
原创 判断链表是否带环?若带环求环的长度?若带环求环的入口点?
//链表定义typedef struct Node{ Node(const int& value) : m_value(value) , m_pNext(NULL) {} int m_value; Node* m_pNext;}Node, *pNode;//判断链表是否带环 pair<pNode, bool> IsExistsLoop(p
2017-07-16 10:28:33
162
原创 逆置/反转单链表+查找单链表的倒数第k个节点
//链表定义typedef struct Node{ Node(const int& value) : m_value(value) , m_pNext(NULL) {} int m_value; Node* m_pNext;}Node,pNode ResList(pNode pHead){ if (pHead == NULL) r
2017-07-15 10:46:54
256
原创 实现1+2+3...+n,要求不能使用乘除法、循环、条件判断
/*1.利用构造函数求解 一次创建n个对象,将累加的算法写在构造函数中*/class Temp{public: Temp(){ N++; Sum += N; } static void Reset(){ N = 0; Sum = 0; } static unsigned int Get(){ return Sum; }private: static
2017-07-13 15:13:37
552
原创 合并两个有序单链表
typedef struct Node{ Node(const int& value) : m_value(value) , m_pNext(NULL) {} int m_value; Node* m_pNext;}Node, *pNode ;class List{public: List() : _pHead(NU
2017-07-13 15:05:13
206
原创 shell脚本 符号 `` 和$()的对比 及eval命令
符号 “ 和$()都是用作命令替换的 运行结果 区别 1, 反引号很容易与单引号搞混乱,对初学者来说。有时在一些奇怪的字形显示中,两种符号是一模一样的(直竖两点)。用$()可以更好的避免这种混乱2, 在多层次的复合替换中,反引号须要额外的跳脱( /)处理,而 $( ) 则比较直观。例如: com1com2`` 你这么写就是错的。需要com1/`com2/“如果有多个命令嵌套就比较复杂
2017-06-20 15:27:43
244
原创 epoll
1 #include <stdio.h> 2 #include <sys/epoll.h> 3 #include <sys/types.h> 4 #include <netinet/in.h> 5 #inc
2017-06-14 14:31:14
186
原创 poll
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <poll.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/stat.h>#include <arpa/inet.h>#include <netinet/in.h>#include
2017-06-14 14:26:03
221
原创 i/o多路转接 select(一)
select 模型特点 1.可监控的文件描述符个数取决与文件描述符集的大小(sizeof(fd_set) 的值)。假设:sizeof ( fd_set) = 512, 每个bit表示一个文件描述符,则支持的最大文件描述符是512*8=4096. 2.将fd加入select监控集的同时,还要再使用一个数据结构array保存select监控集中的 fd_set,一是用于再select 返
2017-06-06 11:23:23
243
原创 dup2测试用例 输出重定向
#include<stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include<string.h> #include<arpa/inet.h> #include<netinet/in.h> #include<unistd.h> int main(
2017-06-06 10:11:38
212
原创 多线程、多进程TCP服务器、进程池和线程池
一、多线程TCP服务器 代码如下:#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<string.h>#include<stdlib.h>#include<pthread.h>#include<unistd.
2017-06-02 15:28:27
725
原创 数据链路层:循环冗余检验CRC
在发送端,先把数据划分为组,假定每组 k 个比特。现假定传送的数据 M=101001 ( k=6 )。CRC运算就是在数据 M 的后面添加供差错检测用的 n 位冗余码,然后构成一个帧发送出去,一共发送 ( k + n) 位。在所要发送的数据后面增加 n 位的冗余码,虽然增大了数据传输的开销,但却可以进行差错检测。当传输可能出现差错时,付出这种代价往往时很值得的。这 n 位 冗余码可用以
2017-05-14 13:20:00
603
1
原创 守护进程
#include<stdio.h>#include<sys/stat.h>#include<sys/types.h>#include<stdlib.h>#include<unistd.h>#include<signal.h>/** 精灵进程也称守护进程,是运行在后台的一种特殊进程* 独立于控制终端* 不与用户交互* 自成会话,子成进程组* 可通过 ps axj命令查看
2017-05-11 16:25:26
175
原创 Linux下共享内存及线程的创建
共享内存的创建 接口的.h文件#ifndef _COMM_H#define _COMM_H#include<stdio.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>#include<unistd.h>#define PATHNAME "."#define PROJ_ID 06666static int
2017-03-16 15:32:22
650
原创 创建消息队列
comm.h#ifndef __COMM_H__#define __COMM_H__#include<stdio.h>#include<sys/stat.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#include<unistd.h>#include<string.h>#define PATHNAME ".
2017-03-09 11:32:00
347
原创 查看并且验证管道容量及管道系统的管理方式
1、查看管道容量 通过ulimit -a命令查看自己系统下的管道容量 一次原子写入为512bytes*8=4096bytes 故pipe的容量是512×8×16(缓冲区条目)= 655362、程序验证管道容量算法思想:创建一个管道让其一直写不读取代码#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<fcnt
2017-02-27 19:50:43
394
原创 简单的shell程序
/************************************************************************* > File Name: myshell.c > Author: > Mail: > Created Time: 2017年02月22日 星期三 19时34分38秒 ************************
2017-02-23 07:26:24
237
原创 atexit函数&&t(粘滞位)用途及测试&&FILE结构体
1、atexit 函数解析函数原型: int atexit(void (*function)(void)); 包含头文件:#include <stdlib.h> 函数说明:atexit函数是一个特殊的函数,它是在正常程序退出时调用的函数,我们把他叫为登记函数。 ⼀个进程可以登记若⼲个(具体⾃⼰验证⼀下)个函数,这些函数由exit⾃动调⽤,这些函数被称为终⽌处理函数, atexit函数可以登记
2017-02-19 19:17:12
229
原创 常见的操作系统进程调度算法
一、先来先服务和短作业(进程)优先调度算法1、先来先服务调度算法先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法可用于作业调度也可以进程调度。挡在作业调度该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存中为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,位
2017-02-18 20:01:01
251
原创 unbuntu 下进度条小程序
首先先了解下回车与换行的区别符号 ASCII码 意义\n 10 换行NL\r 13 回车CR回车 \r 本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return换行 \n 本义是光标往下一行(不一定到下一行行首),n的英文newline,控制字符可以写
2017-02-17 19:54:06
184
原创 task_struct结构体详解
1、引言进程是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称。 注意,程序并不是进程,实际上两个或多个进程不仅有可能执行同一程序,而且还有可能共享地址空间等资源。 在进程执行时,都可以被表征为一下元素: - 标识符:与进程相关的唯一标识符,用来区别正在执行的进程和其他进程。 - 状态:描述进程的状态,因为进程有挂起,阻塞,运行等好几个状
2017-02-17 18:40:19
581
原创 vim 插件安装
ubuntu为例 只需在终端下运行 wget https://raw.github.com/ma6174/vim/master/setup.sh -O ma6174_vim_setup.sh && bash ma6174_vim_setup.sh即可效果如下图所示
2017-02-15 20:18:02
200
原创 解析Linux下的stat命令
如图所示会显示3种不同类型的时间,分别是 最近访问时间(access time)最近更改时间(modify time) 最近改动时间(change time)最近访问时间(access time):表示最后一次访问(仅仅是访问)文件的时间最近更改时间(modift time):表示最后一次修改文件的时间最近改动时间(change time):表示最后一次对文件属性改变时
2017-02-15 14:13:39
293
原创 模拟实现scoped_ptr
template<typename T>class my_ScopedStr{public: my_ScopedStr(T* ptr = NULL); ~my_ScopedStr(); T& operator*(); T* operator->(); T* get();private: my_ScopedStr(my_Sc
2016-12-03 00:20:11
230
原创 模拟实现shared_ptr
template<typename T>class my_SharedPtr{public: my_SharedPtr(T* ptr = NULL); ~my_SharedPtr(); my_SharedPtr(my_SharedPtr<T>& ptr); my_SharedPtr<T>& operator=(my_SharedPtr<T>& ptr);priv
2016-12-03 00:17:46
180
原创 C++模板
模板总结l 泛型编程泛型编程:编写与类型无关的逻辑代码,是代码复用的一种手段。模板是泛型编程的基础。模板分为,函数模板和类模板。l 函数模板函数模板:代表了一个函数家族,该函数与类型无关,在使用时被参数化,根据实参类型产生函数的特定的类型版本。函数模板的的格式template返回值类型函数名(参数列表){//......}例
2016-11-28 19:48:27
209
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人