- 博客(24)
- 资源 (3)
- 收藏
- 关注
原创 leetcode:Longest Increasing Subsequence
Given an unsorted array of integers, find the length of longest increasing subsequence.For example,Given [10, 9, 2, 5, 3, 7, 101, 18],The longest increasing subsequence is [2, 3, 7, 101], ther
2016-07-05 10:36:31
437
原创 自制动态语言Medusa的解释器
今天整理了一下学习编译原理时,实现语言Medusa时写的笔记,搞出了一篇类似说明文档的东西,介绍下Medusa语法部分Medusa是一门动态脚本语言,语法和代码格式借鉴Python,运行代码在顶层书写。Medusa不识别':' ';'等符号,但识别white spcae和换行符,用户编程注意:1 + -9:执行结果是-81 + - 9:语法分析错误
2016-05-06 10:58:31
1523
原创 leveldb学习:Cache
leveldb自己实现了cache缓冲区替代算法,参见代码cache.h和cache.c文件。leveldb中table_cache等都是以class cache作为底层实现。 cache.h中,我们看到cache类是一个抽象类,声明了lookup;insert;release;value;erase等函数,同时声明了一个全局函数extern Cache* NewLRUCache(size_t c
2015-08-29 17:19:32
1131
原创 leveldb学习:Memtable和Varint
Memtable:Memtable是leveldb数据在内存中的存储形式,写操作的数据都会先写到memtable中,memtable的size有限制最大值(write_buffer_size)。memtable的底层数据结构是skiplist,class memtable完成的只是key-value的打包和调用底层跳表的接口。 首先看看Memtable的成员变量: //实例化跳表模板 typ
2015-08-24 19:28:51
1522
原创 leveldb学习:skiplist
leveldb中的memtable只是一个封装类,它的底层实现是一个跳表。跳表是一种基于随机数的平衡数据结构,其他的平衡数据结构还有红黑树、AVL树,但跳表的原理比它们简单很多。跳表有点像链表,只不过每个节点是多层结构,通过在每个节点中增加向前的指针提高查找效率。如下图: 在/leveldb/db文件夹下有跳表的实现skiplist.h和跳表的测试程序skiplist_test.cc。temp
2015-08-23 23:09:40
1403
原创 leveldb学习:Env
考虑到移植以及灵活性,leveldb将系统相关的处理(文件/进程/时间)抽象成Evn,用户可以自己实现相应的接口,作为option传入,默认使用自带的实现。 解压目录/util/中放有env的声明和实现代码。env.h中声明了:虚基类env,在env_posix.cc中,派生类PosixEnv继承自env类,是leveldb的默认实现。虚基类WritableFile、SequentialFi
2015-08-22 16:28:43
1963
原创 leveldb学习:内存池Arena
和SGI版的STL一样,leveldb内存分配也采用了memory pool的整理方式,减少内存不断分配释放过程中造成的空间零碎化和浪费。leveldb的内存池实现可参见arena.h和arena.cc,有关内存池的测试代码有arena_test.cc。arena内存池是leveldb的关键组件,是很多其他功能模块(class)的成员,在cache、memtable、table组件中均有使用。 先
2015-08-21 16:13:05
1827
原创 leveldb学习:DBimpl
leveldb将数据库的有关操作都定义在了DB类,它负责整个系统功能组件的连接和调用,是整个系统的脊柱。level::DB是一个接口类,真正的实现在DBimpl类。 作者在文档impl.html中描述了leveldb的实现,其中包括文件组织、compaction和recovery等等。DBimpl的成员变量包括:字符比较器internal_comparator_、配置类options_、bool型
2015-08-20 17:30:13
1131
原创 leveldb学习:Versionedit和Versionset
VersionEdit:compact过程中会有一系列改变当前Version的操作(FileNumber增加,删除input的sstable,增加输出的sstable),为了缩小version切换的时间点,将这些操作封装成versionedit,compact完成时,将versionedit中的操作一次应用到当前version即可得到最新状态的version。 versionedit的成员变量:
2015-08-16 16:19:27
2976
原创 leveldb学习:Version
到此为止,基本上leveldb的主要功能组件都已经分析完了,下面如何把它们组合在一起形成一个高效稳定的数据库,这就是DBimpl类和compact进程的工作。campact进程为了均衡读写的效率,sstable文件分层次(level)管理,db预定义了最大的level值。compact负责将memtable持久化成sstable,以及均衡整个db中各level的sstable。版本控制当执行
2015-07-24 16:51:13
1799
原创 leveldb学习:sstable(2)
block_builderblock.h和.cc里定义了block的entry存储格式和restart,提供了entry的查找接口以及迭代器。那么如何往写block里写entry呢?leveldb遵循面向对象的设计理念在block_builder类里提供了相关接口。
2015-07-22 17:11:28
916
原创 leveldb学习:sstable(1)
memtable是k-v数据在内存中的存储对象,当内存中的memtable达到一定的大小时,就需要dump到磁盘中,而sstable就是数据在磁盘中的存储对象,今天看看leveldb的table对象。有关部分代码在leveldb源码文件下的table文件夹内。
2015-07-20 21:53:47
974
原创 leveldb学习:测试代码续
通过上篇博客,我知道了leveldb的测试程序主函数是如何利用宏TEST和容器tests调用测试程序,今天来看看测试程序,也就是写进_Test_name类的_Run( )究竟实现了什么。
2015-07-17 21:14:48
919
原创 leveldb学习:测试代码
leveldb中带有了大量的测试程序,凡是文件命名中带有_test的文件都是测试代码。就我的理解,阅读测试代码非常要,因为作为一个库,leveldb并不带有main函数,这也不利于我们理解leveldb的结构和流程,而测试代码相当程度上弥补了一点。并且,作为一个在校学生,我们在平时的项目中也极少考虑过写测试代码,今天我就抛砖引玉,以我的水平来剖析下leveldb的测试部分。 leveldb的测试代
2015-07-16 23:14:01
2093
原创 如何利用VS的代码优化和openmp并行计算提高程序运行速度
以前利用多线程为拥有较大量计算的程序提速过,但也深知多线程的同步和程序的调试是一大坑,最近为实验室的项目学习了一点VS下优化代码的设置以及利用openmp加速运算,都是些很基本的提升程序速度的方法,只要稍微修改下代码和设置,就可使程序加速。配合多线程,经过clock()函数验证,我的程序运行可提高60%的速度
2015-07-15 22:43:18
6970
原创 利用C++文件流进行数据块的读写
科研项目上遇到一个文件流的读写问题,要把一个图片像素大小(1392*1038)的矩阵(double型)数据写入磁盘,一开始是用ofstream将数据逐个写入txt文件中,这样做的结果就是写出的文件太大,不利于存储和转移,而且读写速度奇慢,很影响后续工作的速度。还好最近看了leveldb的源码,知道用ofstream的read、write函数将内存中的一块数据与磁盘进行读写。尝试了下,虽然速度和文件的
2015-07-14 10:42:55
2792
原创 leveldb学习开篇
打算研究生在读期间好好学习下leveldb的源码,期望能够从中感悟一下现代软件的开发流程和设计模式,体验一下google编程规范,不得不承认leveldb源码写得很有美感,最后最重要的当然是希望从中进一步理解C++语言的精髓。下面贴两篇博客,一篇是leveldb的使用说明和编程入门,另一篇是我觉得写得很好的leveldb内部结构剖析,两篇博客作为学习leveldb的开始,很不错,日后会更新自己
2015-06-16 22:06:03
1664
原创 C++对象模型之默认构造函数的构造操作,拷贝构造函数同
一个类,如果没有任何的用户声明的的构造函数,那么会有一个默认的构造函数被隐式地声明出来。这个被隐式声明的构造函数,究竟什么时候被合成、被编译器合成的默认构造函数究竟执行怎么样的操作,编译器如何处理用户定义的构造函数,见下:1)类的成员变量带有默认构造函数 (带有default constructor的member class object),合成的default constructor只调
2015-06-15 22:50:13
449
转载 .h和.cpp区别
关于头文件和源文件的分别 首先,我们可以将所有东西都放在一个.cpp文件内. 然后编译器就将这个.cpp编译成.obj,obj是什么东西? 就是编译单元了.一个程序,可以由一个编译单元组成,也可以有多个编译单元组成. 如果你不想让你的源代码变得很难阅读的话, 就请使用多个编译单元吧.(一个函数不能放到两个编译单元里面,但两个以上 就可以分别放在一个单元,也就是cpp里面)
2015-05-22 16:51:47
498
原创 #pragma once 与#ifndef,#define,#endif的差别 、重复定义等相关问题
.cpp文件是一个编译单元,obj文件是编译的输出文件,链接是将所有地obj文件链接起来组成一个exe。链接过程中如果有不同的cpp文件中包含相同的函数名,变量名(注意不包括变量的引用、函数的声明、以及static函数和变量),链接将会报重复定义的错误,很多时候如果把函数和变量的定义写在.h文件,多个cpp包含此.h文件,就极可能会发生这样的错误,所以应该实现写在.cpp中,在.h中声明。有一种情
2015-05-22 15:57:13
1149
转载 模板类和友元函数
模板类的友元分3类:非模板友元约束(bound)模板友元,即友元的类型取决于类被实例化时的类型。非约束(undound)模板友元,即友元的所有具体化都是类的每一个具体化的友元。1.模板类的非模板友元函数templateclass HasFriend{ friend void counts(); //friend to all HaFriend inst
2015-05-22 09:45:32
473
转载 Linux中/etc/init.d
init.d目录包含许多系统各种服务的启动和停止脚本。它控制着所有从acpid到x11-common的各种事务。(acpid 是linux操作系统新型电源管理标准 ;X11也叫做X Window系统,X Window系统 (X11或X)是一种位图显示的视窗系统 。它是在 Unix 和 类Unix 操作系统 ,以及 OpenVMS 上建立图形用户界面的标准工具包和协议,并可用于几乎已有的现代操作系统
2015-05-19 22:21:49
374
原创 多线程编程里如何运用CreateMutex,WaitForSingleObject,ReleaseMutex来实现线程同步
多线程编程里如何运用CreateMutex,WaitForSingleObject,ReleaseMutex来显现线程同步
2015-03-28 15:31:00
1201
原创 opencv库cvProjectPoints2函数遇到的问题
将摄像机的内外参标定好之后,今天用opencv库的cvProjectPoints2的函数计算反投影,得到标定误差,发现误差正常,但是自己用matlab通过矩阵运算得到的误差大的惊人,最后经过几番对cvProjectPoints2和成像模型的研究,发现真正的成像方程是Zc*Mm = K*[R T]*Mw ,很多文章为了推理过程简洁,忽略了这一点,而基于opencv库的标定程序又不输出Zc的值,结果自
2015-03-11 21:04:03
6101
1
摄像机标定-畸变校正-梯形修正软件
2014-10-20
波形采集存储回放系统
2013-05-14
波形采集 存储 回放系统
2013-05-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人