hello head

这道题是京东电话面试给出的,大致意思是:

对于一个文本文件,需要频繁地在它的给定的位置插入新的串,问如何快速地进行插入,并将新的文本信息持久化保存。

 

算法:对于原始文本只进行一次读取,将每次插入的偏移量信息(相对于原始文本的头指针的offset)以及文本信息保存到新的文件里。

文本恢复通过加载原始文本以及插入的文本偏移量信息来恢复。这样工作量文本的恢复上,恢复过程免去了频繁的移位操作。

 

文本的恢复过程:

1. 加载插入文本偏移量信息,可以使用map<int, string>的结构用来存储偏移量和文本信息。由于map本身的性质,遍历map信息时,

偏移量是顺序排列的。

2. 原始文本的过程中,结合map信息,进行恢复。每次读取的字节数与插入的map的key值相关,进行插入操作之后,继续偏移。

 

【发散】若不但有插入,还有删除操作呢? 插入给出的信息是 相对于原始文本头指针的偏移量和待插入文本信息,删除时给出的是相对于原始文本头指针的删除位置和删除字节数。

 新建一个文本,用来存储以下信息:

偏移量 插入操作  插入内容(针对插入操作)

偏移量 删除操作  删除字节(针对删除操作)

可以使用map<int, Operate>来存储插入/删除的信息,int是原始文本头指针的偏移量。其中,Operate的结构如下:

enum eType = {Insert = 0, Del = 1};
typedef struct Operate
{
    enum    eType;      //操作类型:插入、删除
    int     iByte;      //待删除字节数
    string  strText;    //待插入文本内容
}Operate;

 

主要工作还是在文本的恢复。

这是一种很好的外部存储的思路,可以借鉴。

posted on 2017-08-24 17:04  gardonkoo  阅读(103)  评论(0编辑  收藏  举报

hello foot