这道题是京东电话面试给出的,大致意思是:
对于一个文本文件,需要频繁地在它的给定的位置插入新的串,问如何快速地进行插入,并将新的文本信息持久化保存。
算法:对于原始文本只进行一次读取,将每次插入的偏移量信息(相对于原始文本的头指针的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;
主要工作还是在文本的恢复。
这是一种很好的外部存储的思路,可以借鉴。