RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1411378
Accepted
Venoman9867
Venoman9867
Asked:2022-07-19 01:58:43 +0000 UTC2022-07-19 01:58:43 +0000 UTC 2022-07-19 01:58:43 +0000 UTC

爪哇。搜索复杂度 O(1)

  • 772

在此处输入图像描述最近我试图找到一份工作,我被分配了一个测试任务,除了搜索 O(1) 的复杂性之外,我什么都做了。HR 表示,该解决方案基于构建内存索引。你能用一个例子解释一下这意味着什么。在此先感谢!)链接到带有项目的git:(https://github.com/venoman9867/testTask)

java
  • 2 2 个回答
  • 97 Views

2 个回答

  • Voted
  1. Best Answer
    user1715296
    2022-07-19T16:34:22Z2022-07-19T16:34:22Z

    没有索引给出复杂性O(1)。您的解决方案仍然不符合要求。您正在阅读整个文件,尽管工作明确禁止这样做,但您需要熟悉数据库的运行原理以及索引在其中的排列方式。但无论如何,我认为你并没有失去太多:接受“家庭作业”面试的雇主往往马马虎虎。

    然而,更详细一点,我将描述移动的方向。看,FileChannel.map()这是一种处理memory-mapped文件的方法。一般方案如下——首先你需要在内存中建立一个表,对于文件中的行,CSV将记录它们所在文件中的偏移量。表查找需要O(log(N)) 并且不需要磁盘读取。之后,通过偏移量从 mmap 读取条目就足够了。

    • 4
  2. Roman-Stop RU aggression in UA
    2022-07-19T16:54:13Z2022-07-19T16:54:13Z

    这个答案并不能解决面试中提出的问题。特别是,它不能解决问题:

    1. 不需要将所有文件数据加载到内存中
    2. 不优化索引,从某种意义上说,这种幼稚执行中的索引可能不适合内存,需要创建更优化的结构。

    答案回答了作者提出的问题,并描述了创建此类索引的原理,并在上面列出的几点上进行了修改,可以使用。我认为这将是有用的。

    想法是立即在内存中存储一​​个HashMap,其中键是搜索字符串,值是表中行的链接。由于您的字符串表示为String[],它看起来像这样(如果可以创建一组数组):

    Map<String, Set<String[]>> index = new HashMap<>();
    

    但由于 Set<String[]> 不起作用,您需要以不同的方式存储字符串,例如将数组转换为List<String>. 或者,仅在文件中按顺序存储行号。在这种情况下,索引将如下所示:

    Map<String, Set<Integer>> index = new HashMap<>();
    

    您需要为每一列存储这样一个索引,即 需要此类结构的列表。

    从文件中读取一行时,您需要对其进行索引,即 为每一列添加一个指向集合中这样一行的链接:

    String[] stroka;
    List<Map<String, Set<Integer>>> indices = new List<>();
    List<List<String>> allLines = new ArrayList<>();
    int lineNumber = 0;
    while ((stroka = reader2.readNext()) != null) {
       List<String> line = Arrays.asList(stroka);
       if (indices.empty()) { // создаем пустые индексы
          for(int i = 0; i < line.size(); ++i) {
              indices.add(new HashMap<>()); 
          }      
       }
       // индексируем строку
       indexLine(lineNumber, line, indices);
       lineNumber++;
       
    }
    
    void indexLine(int lineNumber, List<String> line, List<Map<String, Set<Integer>>> indices) {
       for(int i = 0; i < line.size(); +i) {
           Set<Integer> lines = indices.get(i).getOrDefault(line.get(i), new HashSet<>());
           lines.add(lineNumber); 
       }
    }
    

    在此过程之后,您可以搜索完全匹配:它将返回列具有“搜索字符串”值indices.get(columnNumber).get("строка поиска")的所有行的索引。这样的查找使用索引查找和查找- 都在 O(1) 中。allLinescolumnNumberArrayListHashMap

    要按前缀搜索,您需要更改indexLine,即在索引中添加一个值,而不仅仅是 for line.get(i),即 列中的值,以及所有前缀:

    void indexLine(int lineNumber, List<String> line, List<Map<String, Set<Integer>>> indices) {
       for(int i = 0; i < line.size(); +i) {
           String value = line.get(i);
           for (int j = 1; j < value.getLength(); ++j) {
               String prefix = value.substring(0, j);
               Set<Integer> lines = indices.get(i).getOrDefault(prefix, new HashSet<>());
               lines.add(lineNumber); 
           }
       }
    }
    

    要解决将数据加载到内存中的问题,您需要更改索引的结构。您需要存储该行相对于文件开头的偏移量,而不是内存中数组中的行号。

    至于索引的大小,很有可能会太大,你需要使用不同的数据结构来优化大小,但查找时间不是 O(1),而是 O(log (n))。

    • 0

相关问题

  • wpcap 找不到指定的模块

  • 如何以编程方式从桌面应用程序打开 HTML 页面?

  • Android Studio 中的 R.java 文件在哪里?

  • HashMap 初始化

  • 如何使用 lambda 表达式通过增加与原点的距离来对点进行排序?

  • 最大化窗口时如何调整元素大小?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5