- 博客(45)
- 资源 (3)
- 收藏
- 关注
转载 skipList
什么是跳表?要说清楚这个问题,我们就要先从普通的有序链表说起。一个普通有序列表的结构如下:我们可以看到,上图所示的链表按照由小到大的顺序排列(-1表示最小值,1表示最大值,这是本文的一个约定),如果我们想要查找一个元素x,算法如下:123cell *p = head;while (p->next->key x) p=p->next;re
2015-03-31 15:50:44 306
转载 跳表
为什么选择跳表目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。 想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树出来吗? 很难吧,这需要时间,要考虑很多细节,要参考一堆算法与数据结构之类的树,还要参考网上的代码,相当麻烦。 用跳表吧,跳表是一种随机化的数据结构,目前
2015-03-31 15:47:41 278
转载 伙伴系统
Buddy memory allocation (伙伴内存分配器)https://github.com/cloudwu/buddy/blob/master/buddy.c
2015-03-31 11:28:37 320
转载 c 变长数组
今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用struct实现变长数组的技术。下面是我在网上找到的一篇讲解很清楚的文章。在实际的编程中,我们经常需要使用变长数组,但是C语言并不支持变长的数组。此时,我们可以使用结构体的方法实现C语言变长数组。struct MyData
2015-03-30 22:56:49 390
转载 几个系统调用分析 glibc中的malloc调用和共享内存原理
本文主要分析内存以及I/O相关的系统调用和库函数的实现原理,根据原理给出在使用过程中需要注意的问题和优化的侧重点,本文涉及到的系统调用包括readahead,pread/pwrite,read/write,mmap,readv/writev,sendfile,fsync/fdatasync/msync,shmget,malloc。本文先简单介绍应用程序对内存的使用以及I/O系统对内存的使用
2015-03-30 22:33:58 809
转载 内存映射文件
一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有什么区别,而且映射这个词也很让人迷茫,今天终于搞清楚了。。。下面,我先解释一下我对映射这个词的理解,再区分一下几个容易混淆的概念,之后,什么是内存映射就很明朗了。 原理首先,“映射”这个词,就和数学课上说的“一一映射”是一个意思,就是建立一种一一对应关系,在这里主要是只 硬盘上文件 的位置与进程 逻辑地址空间 中一块大小相同的区域之间的一一对
2015-03-30 21:23:02 331
转载 优化
优化是一个非常大的主题,本文并不是去深入探讨性能分析理论,算法的效率,况且我也没有这个能力。我只是想把一些可以简单的应用到你的C++代码中的优化技术总结在这里,这样,当你遇到几种不同的编程策略的时候,就可以对每种策略的性能进行一个大概的估计。这也是本文的目的之所在。目录: 一. 优化之前 二. 声明的放置 三. 内联函数 四. 优化你的内存使用 五
2015-03-30 17:13:57 277
转载 频繁分配释放内存导致的性能问题的分析
现象1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 2 用ps -o majflt,minflt -C program命令查看,发现majflt每秒增量为0,而minflt每秒增量大于10000。 初步分析majflt代表major fault,中文名叫大错误,min
2015-03-30 16:55:57 329
转载 linux mmap 详解
linux mmap 详解谨以此文纪念过往的岁月一.前言mmap的具体实现以前在学习内核时学习过,但是对于其中的很多函数是一知半解的,有些只能根据其函数名来猜测其具体的功能,在本文中,一起来重新深入理解其具体的实现。二.mmap的用户层应用void *mmap(void *start,size_t length,int prot,int flags,int fd,o
2015-03-30 16:43:12 264
转载 Linux 大页面使用与实现简介
Linux 大页面使用与实现简介为了减少 TLB Miss 对应用程序性能的影响,Linux 内核支持以 2MB 作为物理页面分页的基本单位。 Linux 内核采用基于 Hugetlb 伪文件系统的实现方式支持大页面,虽然较大地提升了应用程序的性能,但由于不能做到完全的透明性,对应用程序的移植带来了挑战。本文对 Linux 大页面机制的使用和实现进行了简要的介绍和分析。
2015-03-30 16:40:27 3605
转载 c ,c++
linux和os:*、netstat tcpdump ipcsipcrm 点击打开链接*、cpu内存硬盘等等与系统性能调试相关的命令 点击打开链接*、设置修改权限tcp网络状态查看各进程状态抓包相关等相关命令 tcpdump netstat ps……awk sed需掌握*、共享内存的使用实现原理 点击打开链接 必考必问*
2015-03-30 16:27:04 691
转载 linux mmap
一、概述 内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间用户空间两者之间需要大量数据传输等操作的话效率是非常高的。以下是一个把普遍文件映射到用户空间的内存区域的示意图。图一: 二、基本函数
2015-03-30 16:24:19 313
转载 mmap
由于项目需要,所以学习了一下Linux下内存映射文件的用法,在这里共享一下自己的收获,希望大家提出宝贵意见,进行交流。 简介: 内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,只是内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而非系统的页文件,而且在对该文件进行操作之前必须首先对
2015-03-30 16:13:38 323
转载 索引
头条博客资源翻译小组相亲注册登录摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使
2015-03-25 22:12:40 457
转载 c++11 move
Move semantics (Move语义)这是C++11中所涵盖的另一个重要话题。就这个话题可以写出一系列文章,仅用一个段落来说明显然是不够的。因此在这里我不会过多的深入细节,如果你还不是很熟悉这个话题,我鼓励你去阅读更多地资料。C++11加入了右值引用(rvalue reference)的概念(用&&标识),用来区分对左值和右值的引用。左值就是一个有名字的对象,而右值则是一个
2015-03-25 18:33:52 423
转载 判断ip地址
#include bool IsDigit(char Digit){ bool Flag = false; if(Digit >= '0' && Digit <= '9') { Flag = true; } return Flag;}bool IsFormatValid(char IP[]){ int DotCnt =
2015-03-25 18:25:03 398
转载 递归 反转链表
//递归方式 ListNode * ReverseList2(ListNode * head) { //如果链表为空或者链表中只有一个元素 if(head==NULL || head->m_pNext==NULL) return head; else { ListNode * newhea
2015-03-25 18:23:53 279
转载 约瑟夫环 数学解法
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围;从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。f[1]=0; f[i]=(f[i-1]+m)%i; (i>1)公式1的推导:——————————给出一个序列,从0~n-1编
2015-03-22 15:22:30 700
转载 第二大的数
int find_second_biggest(vectorint> &v){ int len = v.size(); int max,second; if (len 2){ return -1; } if (v[0]>v[1]){ second = v[1];
2015-03-22 14:31:56 317
原创 shared_pointer
class HasPtr{public: HasPtr(const string &s=string()):ps(new string(s)),i(0),use(new size_t(1)){} HasPtr(const HasPtr &p):ps(p.ps),i(p.i),use(p.use){++*use;} HasPtr& operator = (const H
2015-03-20 10:27:06 406
转载 模版特化 偏特化
模板为什么要特化,因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的。模板分为类模板与函数模板,特化分为全特化与偏特化。全特化就是限定死模板实现的具体类型,偏特化就是如果这个模板有多个类型,那么只限定其中的一部分。先看类模板:[cpp] view plaincopytemplatetypename T
2015-03-20 09:34:58 323
转载 c++ map unordered_map
在C++中最让我蛋疼的事情之一就是unordered_map千呼万唤才出来,在C++早期版本标准库里面只有map这个字典。 但是map的内部实现是采用的红黑树,众所周知,对于字典这类结构也可以用hash表来实现,也就是C++的标准库应该也要有hash_map这种数据结构。红黑树实现的map占用内存较小,但是查找效率不高,O(logn)的查找效率。hash表实现的map占用内存较大,但是
2015-03-19 22:00:08 688
转载 MIC 内存分配中使用2M大页面
如何在offload代码输入输出变量的内存分配中使用2M大页面xiaoping-duan (Intel) 于 2014 年 6 月 23 日 提交新浪 腾讯英特尔编译器为至强融核™ 协处理器提供的offload编译模式使程序员可以在一段主机代码中加入编译指示或者某些新的关键字使指定的代码段运行在协处理器上。在显式拷贝模式下,程序员在使用o
2015-03-19 21:52:21 844
转载 nginx源码学习----内存池
最近在进行监控平台的设计,之前一直觉得C/C++中最棘手的部分是内存的管理上,远不止new/delete、malloc/free这么简单。随着代码量的递增,程序结构复杂度的提高。各种内存方面的问题悄然滋生。而且作为平台,后期的插件扩展在所难免。长时间运行的采集平台的特性更是提出了对稳定性的高要求。不是c#、java,没有虚拟机为你管理内存,一切都要靠自己。于是想看看nginx、python、lua
2015-03-19 13:29:24 321
转载 c 内存函数
前言: 在开发中,很多时候需要动态分配内存,这就需要使用到c标准库中的各个内存分配函数了。下面来讲解一下这些函数的使用方法,相互间的异同。一,alloc 头文件:#include 函数定义:void *alloca(size_t size); 函数说明:alloca() 用来配置 size 个字节的内存空间,然而和 malloc、colloc 不同
2015-03-19 10:25:01 364
转载 c _alloca 函数的实现
_alloca 函数的实现C 语言里有一个 alloca 函数,可以在堆栈上分配一块内存,当前函数退出时,由于系统堆栈指针的调整,这块内存会被自动回收。alloca 的函数原型是void *alloca(size_t size);今天,在各种编程文档中已经不太提倡使用了。因为它有许多不安全因素。这里暂且不讨论。另外,在 CRT 库里,通常还会提供一个 _alloca
2015-03-19 10:24:57 1944
转载 用 C 实现一个变长数组
用 C 实现一个变长数组我想用 C++ 的人都用过 std::vector 。它是一个可变长的数组,在很多时候都比 C 固有的定长数组要灵活。C 里没有这样的标准化设施,但是写软件的人通常都会实现一个。正所谓,不厌其烦的重造轮子 :D 。这里我们不讨论造轮子的好坏问题,直接讨论下实现这么个东西的一点小技巧吧。总是固执于用谁做的轮子的问题,眼光就太短浅了。一般的 vector 的
2015-03-19 09:58:20 534
转载 Placement new 存在的理由
Placement new 存在的理由(1).用Placement new 解决buffer的问题问 题描述:用new分配的数组缓冲时,由于调用了默认构造函数,因此执行效率上不佳。若没有默认构造函数则会发生编译时错误。如果你想在预分配的内存上创建 对象,用缺省的new操作符是行不通的。要解决这个问题,你可以用placement new构造。它允许你构造一个新对象到预分配的内存上。
2015-03-18 22:12:32 376
转载 c,c++ 代码优化
1. 记住阿姆达尔定律:funccost是函数func运行时间百分比,funcspeedup是你优化函数的运行的系数。所以,如果你优化了函数TriangleIntersect执行40%的运行时间,使它运行快了近两倍,而你的程序会运行快25%。这意味着不经常使用的代码不需要做较多优化考虑(或者完全不优化)。这里有句俗语:让经常执行的路径运行更加高效,而运行稀少的路径正确运行。
2015-03-17 14:33:01 534
原创 virtual
class base{ public : virtual int number(){return 0;} char letter(){return 'b';}};class two:public base{public: virtual int number() {return 2;} char letter(){
2015-03-17 09:07:43 360
转载 统计代码行数
wc -l *.c *.h 就可以知道当前目录下的所有c 和 h 文件的行数的详细信息。很不错如果要递归,可以配合其他命令一起使用当前目录及子目录:find . -name *.c |xargs wc -lfind . -name *.cpp | xargs wc -lfind . -name *.h |xargs wc -l想一下子 ,或许简单的可以 使用重定
2015-03-15 13:46:45 421
转载 筛选法
#includeusing namespace std;const int MAXV = 10000; //素数表范围bool flag[MAXV+1]; //标志一个数是否为素数int prime[MAXV+1]; //素数表,下标从0开始int size; //素数个数void genPrime(int max){memset(flag, true, sizeo
2015-03-10 11:23:33 452
原创 打靶问题
void DFS(int dep,int &count,int &sum){ if(dep>4) return; if(dep==4&&sum==10) { count++; return; } for(int i=0;i<=10;i++) { sum=su
2015-03-10 10:34:18 456
原创 BST
TreeNode *bstInsert(TreeNode *root,int data)//可以从0开始构造。{ if(root==NULL) { TreeNode *r=new TreeNode(data); return r; } else { if(dataval) root->left=
2015-03-09 21:59:43 279
原创 k 大数
实际上是k_th number!!!!O(m + n) 的解法比较直观,直接merge 两个数组,然后求第k 大的元素。不过我们仅仅需要第k 大的元素,是不需要“排序”这么复杂的操作的。可以用一个计数器,记录当前已经找到第m 大的元素了。同时我们使用两个指针pA 和pB,分别指向A 和B 数组的第一个元素,使用类似于merge sort 的原理,如果数组A 当前元素小,那么pA++
2015-03-07 15:35:39 279
转载 俩数组求中位数
设数组A的长度为m, 数组B的长度为n, 两个数组都都是递增有序的。求这两个数组的中位数首先我们看看中位数的特点,一个大小为n的数组,如果n是奇数,则中位数只有一个,数组中恰好有 (n-1)/2 个元素比中位数小。如果n是偶数,则中位数有两个(下中位数和上中位数),这里我们只求下中位数,对于下中位数,数组中恰好有(n-1)/2个元素比下中位数小
2015-03-07 10:29:01 1033
转载 剔除字符
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。最简单的方法当然是,对于str1中的每个字母,去str2中扫描一遍,如果没有那么就把str1中当前位置之后的所有字母都往前移动一个位置.以此类推,复杂度为O(n*n);首先我
2015-03-05 21:20:25 451
原创 离散事件模拟
相当于一个时间轴,但是管着四个队列的进出情况。第个队列的人员进入时,都要预报下一个人员进来的时刻,并登记下一个人员进来时刻到时间轴,同时将自己进来的时刻及逗留时间选择一个最短的队列进行注册,如果自己是第一个进来的,或者可以排到某一队列的第一位,则还要在时间轴上登记出的时间。离开时,自己将注册的队列信息删除,同时,当前队列的下一个人向时间轴预报自己离开的时间。可见,时间轴
2015-03-05 20:12:24 1191
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人