zoukankan      html  css  js  c++  java
  • 【京东-深圳】文本文件的频繁插入

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

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

    算法:对于原始文本只进行一次读取,将每次插入的偏移量信息(相对于原始文本的头指针的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;

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

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

  • 相关阅读:
    分享一些书籍,方方面面,很多值得一读
    C#网络爬虫--多线程处理强化版
    图书管理系统
    jquery完成界面无刷新加载登陆注册
    springboot jar项目 改为war项目
    nginx 配置文件配置(ssl和代理80端口)
    linux 安装mysql8.0
    linux redis安装和启动,远程链接
    linux nginx 安装启动
    linux tar方式安装配置jdk
  • 原文地址:https://www.cnblogs.com/gardonkoo/p/7424022.html
Copyright © 2011-2022 走看看