【问题标题】:Which data structure for fast lookup, variable length, and order?哪种数据结构用于快速查找、可变长度和顺序?
【发布时间】:2015-05-26 18:20:10
【问题描述】:

我会提前说明这不是家庭作业问题,而是我正在从事的业余项目的一部分。我有一个可行的解决方案,但我觉得我的解决方案很混乱,而且空间效率低。

我有一个物品清单。

  • 列表的长度是可变的。项目按索引删除。项目被添加到列表的末尾。项目可以重复。
  • 当查找一个项目时,它只是检查它是否已经在列表中。每个项目都有一个项目唯一的“密钥”。
  • 项目根据用户分配的优先级进行排序。

现在我正在使用两种数据结构来实现我的目标。

我有一个基于优先级排序的 ArrayList(用于保持顺序),以及一个基于项目键排序的 ArrayList(用于快速查找)。

是否有一个单一的数据结构可以解决这个问题?如果这很重要,我正在用 Java 编码。排序集几乎是我想要的,但是因为有重复,我认为这行不通

【问题讨论】:

  • 你能发布一些示例代码吗?
  • 老实说,我几乎认为地图会更好。
  • 如果您使用的是唯一键,则可以使用 hashmap 或其变体。
  • A Map 是一个更好的解决方案,但你的两个 ArrayLists 并不是低效的。您有两组指向相同对象的指针。你必须保持你的两个 ArrayLists 同步。

标签: java algorithm sorting lookup


【解决方案1】:

由于您想要按键查找,您应该使用某种 Map。

由于您希望多个对象与同一个键关联,因此您需要一个键映射到对象列表,而不是键映射到单个对象。

我会使用 TreeMap 以便可以对其进行排序,其中键是您的键,值是 ArrayList 用于应该为该键返回的对象列表。

您必须实现一个比较器才能获得所需的排序。

使用列表映射时要考虑的一件事是,当您要添加项目时,您需要检查映射是否已经包含该键的列表。

例如如果您的地图如下所示:

Map<String, List<Object>> map = new TreeMap<String, ArrayList<Object>>();

添加对象如下所示:

   public void addObject(String key, Object object) {
       List<Object> objects = map.get(key);
       if (objects == null) {
           objects = new ArrayList<Object>();
           map.put(key, objects);
       }
       objects.add(object);
   }

【讨论】:

  • 程序到接口,Map&lt;String, List&lt;Object&gt;&gt;更好
【解决方案2】:

您要查找的内容在 RDBMS 中称为 compound key。如果您使用复合键(priority, key)创建一个 ArrayList,您将拥有一个单一的数据结构。

【讨论】:

    【解决方案3】:

    我不确定单个数据结构,但您可以将ArrayList&lt;&gt;HashSet&lt;&gt;结合使用

    创建一个包装器类,用于包装Itempriority,我认为这是一个int 值。

    class ItemWithPriority
    {
        private Item item;
        private int priority;
    
        ItemWithPriority(Item item, int priority)
        {
          this.item = item;
          this.priority = priority;
        }
    } 
    

    维护一个始终基于自定义Comparator&lt;ItemWithPriority&gt; 排序的ArrayList&lt;ItemWithPriority&gt;,该自定义Comparator&lt;ItemWithPriority&gt; 基于priority 进行比较。

    另外维护一个HashSet&lt;Item&gt;,其中包含给定时间点所有项目的集合。

    插入:

    itemWithPriorityList.add(new ItemWithPriority(item, priority));
    Collections.sort(itemWithPriorityList, new PriorityBasedComparator());
    itemSet.add(item);
    

    删除:(基于索引)

    Item itemToBeRemoved = itemWithPriorityList.get(index);
    itemWithPriorityList.remove(index);
    itemSet.remove(itemToBeRemoved);
    

    查找:

    itemSet.contains(item)
    

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 2013-06-03
      • 2011-04-09
      相关资源
      最近更新 更多