【问题标题】:looking for a smart and fast searching algorithm寻找一种智能且快速的搜索算法
【发布时间】:2012-08-20 19:53:31
【问题描述】:

假设我有 2 个对象数组,它们在以下模式中相互映射:

数组1:

String [] prog_types1 = {"Program1","Program2","Program3","Program4"};

和数组2:

String [] prog_types2 ={"SubProgram1","SubProgram2","SubProgram3","SubProgram4",  
"SubProgram5","SubProgram6","SubProgram7","SubProgram8","SubProgram9","SubProgram10"};

正如它的名字所理解的,prog_types2 是 prog_types1 的扩展,但有一些重复的值,所以这些程序之间的完整映射看起来像这样:

prog_types1     prog_types2
ProgramType1    SubProgramType1
ProgramType1    SubProgramType2
ProgramType1    SubProgramType7
ProgramType1    SubProgramType9
ProgramType2    SubProgramType12
ProgramType2    SubProgramType7
ProgramType2    SubProgramType9
ProgramType3    SubProgramType1
ProgramType3    SubProgramType2
ProgramType3    SubProgramType21
ProgramType3    SubProgramType27
ProgramType3    SubProgramType7
ProgramType5    SubProgramType12
ProgramType5    SubProgramType9

我的问题是:从更快的处理和重用的角度来看,将这些数组相互映射的最佳方式是什么? 我已将其实现为:

-- 类集(类 prog1 和 prog2 并放入向量后)...

-- 带哈希集的哈希表

-- 可能还有一个数组

我正在寻找的方式不应该包括为 prog1 对象再次创建相同的 prog2 对象,就像前面描述的所有方式一样,而是通过例如索引位置或以任何其他方式映射它。 只是寻找一种很好的算法方法来解决它......

提前致谢

附言它应该只在几个类之间的 1 个包中使用,它的主要用途是基于 prog1 类型值的 prog2 类型值的填充

p.s.2 java7

【问题讨论】:

    标签: java algorithm data-structures map java-7


    【解决方案1】:

    使用 Guava Libraries 中的 MultiMap,您可以说:

    Multimap<String, String> mmap = ArrayListMultimap.create();
    mmap.put("Program1", "SubProgramType1");
    mmap.put("Program1", "SubProgramType2");
    // etc.
    
    mmap.get("Program1")
    

    看起来像:

    [SubProgramType1, SubProgramType2, SubProgramType7, SubProgramType9]
    

    顺便说一句,哈希表现在不用于散列集合,已被HashMap 取代:)

    【讨论】:

    • 是的,看起来这是最好的解决方案
    【解决方案2】:

    IMO 最好的方法是:

    Map<String, List<String>> programs = new HashMap<String, List<String>>();
    

    将第一个列表中的字符串作为键,相应的子程序组成值列表。现在映射很明显:

    ProgramType1 -> [SubProgramType1, SubProgramType2, SubProgramType7, SubProgramType9]
    ProgramType2 -> [SubProgramType12, SubProgramType7, SubProgramType9]
    ProgramType3 -> [SubProgramType1, SubProgramType2, SubProgramType21, SubProgramType27, SubProgramType7]
    ProgramType5 -> [SubProgramType12, SubProgramType9]
    

    【讨论】:

    • 那么和Hashtable>有什么区别?
    • @user1324100:这取决于。您对 Hashset 而不是简单的 List 的值有什么特殊用途吗?
    【解决方案3】:

    Guava ListMultimap,给List&lt;E&gt;,而不是Collection&lt;E&gt; - 更令人愉快。

    private ListMultimap<String,Something> stuff = ArrayListMultimap.create();
    
    // ...
    
    public void add(String key, Something item) {
      stuff.put(key, item);
    }
    
    public List<Something> get(String key) {
      // might as well use the Lists convenience API while we're at it.
      return Lists.newArrayList(stuff.get(key));
    }
    

    http://www.coffee-bytes.com/2011/12/22/guava-multimaps

    【讨论】:

      【解决方案4】:

      顺便说一句,因为我需要:

      -- 单独使用 Program1 的值

      -- 单独使用 SubProgram1 的值

      -- 根据 Program1 值填充 SubProgram1 值

      这里最简单的解决方案是声明一个包含所有重复项的二维数组(因为它在完整地图模式中不正常显示),并且对于 1) 和 2) 使用非重复算法从其中填充数据和 3) 从第 2 次循环循环维度

      所以没有理由声明 3 个对象、巨大的内存节省和不错的方法。 我给自己一颗星:)

      【讨论】:

        猜你喜欢
        • 2011-03-27
        • 1970-01-01
        • 2021-01-24
        • 1970-01-01
        • 2014-01-09
        • 2016-06-09
        • 2022-11-09
        • 2014-11-05
        • 1970-01-01
        相关资源
        最近更新 更多