<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[tmshasha的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/tmshasha</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; tmshasha]]></copyright><item><title><![CDATA[leetcode:Longest Increasing Subsequence]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/51829432</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/51829432</guid><author>tmshasha</author><pubDate>Tue, 05 Jul 2016 10:36:31 +0800</pubDate><description><![CDATA[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]]></description><category></category></item><item><title><![CDATA[自制动态语言Medusa的解释器]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/51329597</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/51329597</guid><author>tmshasha</author><pubDate>Fri, 06 May 2016 10:58:31 +0800</pubDate><description><![CDATA[今天整理了一下学习编译原理时，实现语言Medusa时写的笔记，搞出了一篇类似说明文档的东西，介绍下Medusa


语法部分

Medusa是一门动态脚本语言，语法和代码格式借鉴Python，运行代码在顶层书写。

Medusa不识别':' ';'等符号，但识别white spcae和换行符，用户编程注意：

1 + -9：执行结果是-8

1 + - 9：语法分析错误]]></description><category></category></item><item><title><![CDATA[leveldb学习：Cache]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/48088933</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/48088933</guid><author>tmshasha</author><pubDate>Sat, 29 Aug 2015 17:19:32 +0800</pubDate><description><![CDATA[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]]></description><category></category></item><item><title><![CDATA[leveldb学习：Memtable和Varint]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/47955707</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/47955707</guid><author>tmshasha</author><pubDate>Mon, 24 Aug 2015 19:28:51 +0800</pubDate><description><![CDATA[Memtable：Memtable是leveldb数据在内存中的存储形式，写操作的数据都会先写到memtable中，memtable的size有限制最大值（write_buffer_size）。memtable的底层数据结构是skiplist，class memtable完成的只是key-value的打包和调用底层跳表的接口。  
首先看看Memtable的成员变量： //实例化跳表模板
  typ]]></description><category></category></item><item><title><![CDATA[leveldb学习：skiplist]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/47915279</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/47915279</guid><author>tmshasha</author><pubDate>Sun, 23 Aug 2015 23:09:40 +0800</pubDate><description><![CDATA[leveldb中的memtable只是一个封装类，它的底层实现是一个跳表。跳表是一种基于随机数的平衡数据结构，其他的平衡数据结构还有红黑树、AVL树，但跳表的原理比它们简单很多。跳表有点像链表，只不过每个节点是多层结构，通过在每个节点中增加向前的指针提高查找效率。如下图: 
 
在/leveldb/db文件夹下有跳表的实现skiplist.h和跳表的测试程序skiplist_test.cc。temp]]></description><category></category></item><item><title><![CDATA[leveldb学习：Env]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/47860573</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/47860573</guid><author>tmshasha</author><pubDate>Sat, 22 Aug 2015 16:28:43 +0800</pubDate><description><![CDATA[考虑到移植以及灵活性，leveldb将系统相关的处理（文件/进程/时间）抽象成Evn，用户可以自己实现相应的接口，作为option传入，默认使用自带的实现。  
解压目录/util/中放有env的声明和实现代码。env.h中声明了:
虚基类env，在env_posix.cc中，派生类PosixEnv继承自env类，是leveldb的默认实现。
虚基类WritableFile、SequentialFi]]></description><category></category></item><item><title><![CDATA[leveldb学习：内存池Arena]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/47836159</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/47836159</guid><author>tmshasha</author><pubDate>Fri, 21 Aug 2015 16:13:05 +0800</pubDate><description><![CDATA[和SGI版的STL一样，leveldb内存分配也采用了memory pool的整理方式，减少内存不断分配释放过程中造成的空间零碎化和浪费。leveldb的内存池实现可参见arena.h和arena.cc，有关内存池的测试代码有arena_test.cc。arena内存池是leveldb的关键组件，是很多其他功能模块（class）的成员，在cache、memtable、table组件中均有使用。 
先]]></description><category></category></item><item><title><![CDATA[leveldb学习：DBimpl]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/47811183</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/47811183</guid><author>tmshasha</author><pubDate>Thu, 20 Aug 2015 17:30:13 +0800</pubDate><description><![CDATA[leveldb将数据库的有关操作都定义在了DB类，它负责整个系统功能组件的连接和调用，是整个系统的脊柱。level::DB是一个接口类，真正的实现在DBimpl类。 
作者在文档impl.html中描述了leveldb的实现，其中包括文件组织、compaction和recovery等等。DBimpl的成员变量包括：字符比较器internal_comparator_、配置类options_、bool型]]></description><category></category></item><item><title><![CDATA[leveldb学习：Versionedit和Versionset]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/47703245</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/47703245</guid><author>tmshasha</author><pubDate>Sun, 16 Aug 2015 16:19:27 +0800</pubDate><description><![CDATA[VersionEdit:compact过程中会有一系列改变当前Version的操作（FileNumber增加，删除input的sstable,增加输出的sstable），为了缩小version切换的时间点，将这些操作封装成versionedit，compact完成时，将versionedit中的操作一次应用到当前version即可得到最新状态的version。 
versionedit的成员变量：]]></description><category></category></item><item><title><![CDATA[leveldb学习：Version]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/47043621</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/47043621</guid><author>tmshasha</author><pubDate>Fri, 24 Jul 2015 16:51:13 +0800</pubDate><description><![CDATA[到此为止，基本上leveldb的主要功能组件都已经分析完了，下面如何把它们组合在一起形成一个高效稳定的数据库，这就是DBimpl类和compact进程的工作。
campact进程
为了均衡读写的效率，sstable文件分层次（level）管理，db预定义了最大的level值。compact负责将memtable持久化成sstable，以及均衡整个db中各level的sstable。
版本控制
当执行]]></description><category></category></item><item><title><![CDATA[leveldb学习：sstable(2)]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/46989253</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/46989253</guid><author>tmshasha</author><pubDate>Wed, 22 Jul 2015 17:11:28 +0800</pubDate><description><![CDATA[block_builder

block.h和.cc里定义了block的entry存储格式和restart，提供了entry的查找接口以及迭代器。那么如何往写block里写entry呢？leveldb遵循面向对象的设计理念在block_builder类里提供了相关接口。]]></description><category></category></item><item><title><![CDATA[leveldb学习：sstable(1)]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/46974671</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/46974671</guid><author>tmshasha</author><pubDate>Mon, 20 Jul 2015 21:53:47 +0800</pubDate><description><![CDATA[memtable是k-v数据在内存中的存储对象，当内存中的memtable达到一定的大小时，就需要dump到磁盘中，而sstable就是数据在磁盘中的存储对象，今天看看leveldb的table对象。有关部分代码在leveldb源码文件下的table文件夹内。]]></description><category></category></item><item><title><![CDATA[leveldb学习：测试代码续]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/46932837</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/46932837</guid><author>tmshasha</author><pubDate>Fri, 17 Jul 2015 21:14:48 +0800</pubDate><description><![CDATA[通过上篇博客，我知道了leveldb的测试程序主函数是如何利用宏TEST和容器tests调用测试程序，今天来看看测试程序，也就是写进_Test_name类的_Run( )究竟实现了什么。]]></description><category></category></item><item><title><![CDATA[leveldb学习：测试代码]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/46918959</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/46918959</guid><author>tmshasha</author><pubDate>Thu, 16 Jul 2015 23:14:01 +0800</pubDate><description><![CDATA[leveldb中带有了大量的测试程序，凡是文件命名中带有_test的文件都是测试代码。就我的理解，阅读测试代码非常要，因为作为一个库，leveldb并不带有main函数，这也不利于我们理解leveldb的结构和流程，而测试代码相当程度上弥补了一点。并且，作为一个在校学生，我们在平时的项目中也极少考虑过写测试代码，今天我就抛砖引玉，以我的水平来剖析下leveldb的测试部分。 
leveldb的测试代]]></description><category></category></item><item><title><![CDATA[如何利用VS的代码优化和openmp并行计算提高程序运行速度]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/46900181</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/46900181</guid><author>tmshasha</author><pubDate>Wed, 15 Jul 2015 22:43:18 +0800</pubDate><description><![CDATA[以前利用多线程为拥有较大量计算的程序提速过，但也深知多线程的同步和程序的调试是一大坑，最近为实验室的项目学习了一点VS下优化代码的设置以及利用openmp加速运算，都是些很基本的提升程序速度的方法，只要稍微修改下代码和设置，就可使程序加速。配合多线程，经过clock()函数验证，我的程序运行可提高60%的速度]]></description><category></category></item><item><title><![CDATA[利用C++文件流进行数据块的读写]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/46874455</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/46874455</guid><author>tmshasha</author><pubDate>Tue, 14 Jul 2015 10:42:55 +0800</pubDate><description><![CDATA[科研项目上遇到一个文件流的读写问题，要把一个图片像素大小（1392*1038）的矩阵（double型）数据写入磁盘，一开始是用ofstream将数据逐个写入txt文件中，这样做的结果就是写出的文件太大，不利于存储和转移，而且读写速度奇慢，很影响后续工作的速度。还好最近看了leveldb的源码，知道用ofstream的read、write函数将内存中的一块数据与磁盘进行读写。尝试了下，虽然速度和文件的]]></description><category></category></item><item><title><![CDATA[leveldb学习开篇]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/46524189</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/46524189</guid><author>tmshasha</author><pubDate>Tue, 16 Jun 2015 22:06:03 +0800</pubDate><description><![CDATA[打算研究生在读期间好好学习下leveldb的源码，期望能够从中感悟一下现代软件的开发流程和设计模式，体验一下google编程规范，不得不承认leveldb源码写得很有美感，最后最重要的当然是希望从中进一步理解C++语言的精髓。
下面贴两篇博客，一篇是leveldb的使用说明和编程入门，另一篇是我觉得写得很好的leveldb内部结构剖析，两篇博客作为学习leveldb的开始，很不错，日后会更新自己]]></description><category></category></item><item><title><![CDATA[C++对象模型之默认构造函数的构造操作，拷贝构造函数同]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/46509089</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/46509089</guid><author>tmshasha</author><pubDate>Mon, 15 Jun 2015 22:50:13 +0800</pubDate><description><![CDATA[一个类，如果没有任何的用户声明的的构造函数，那么会有一个默认的构造函数被隐式地声明出来。这个被隐式声明的构造函数，究竟什么时候被合成、被编译器合成的默认构造函数究竟执行怎么样的操作，编译器如何处理用户定义的构造函数，见下：

1）类的成员变量带有默认构造函数 （带有default constructor的member class object），合成的default constructor只调]]></description><category></category></item><item><title><![CDATA[.h和.cpp区别]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/45919161</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/45919161</guid><author>tmshasha</author><pubDate>Fri, 22 May 2015 16:51:47 +0800</pubDate><description><![CDATA[关于头文件和源文件的分别 
首先,我们可以将所有东西都放在一个.cpp文件内. 
然后编译器就将这个.cpp编译成.obj,obj是什么东西? 
就是编译单元了.一个程序,可以由一个编译单元组成,也可以有多个编译单元组成. 如果你不想让你的源代码变得很难阅读的话, 
就请使用多个编译单元吧.(一个函数不能放到两个编译单元里面,但两个以上 
就可以分别放在一个单元,也就是cpp里面)]]></description><category></category></item><item><title><![CDATA[#pragma once 与#ifndef，#define，#endif的差别 、重复定义等相关问题]]></title><link>https://blog.youkuaiyun.com/tmshasha/article/details/45918219</link><guid>https://blog.youkuaiyun.com/tmshasha/article/details/45918219</guid><author>tmshasha</author><pubDate>Fri, 22 May 2015 15:57:13 +0800</pubDate><description><![CDATA[.cpp文件是一个编译单元，obj文件是编译的输出文件，链接是将所有地obj文件链接起来组成一个exe。链接过程中如果有不同的cpp文件中包含相同的函数名，变量名（注意不包括变量的引用、函数的声明、以及static函数和变量），链接将会报重复定义的错误，很多时候如果把函数和变量的定义写在.h文件，多个cpp包含此.h文件，就极可能会发生这样的错误，所以应该实现写在.cpp中，在.h中声明。有一种情]]></description><category></category></item></channel></rss>