实施EntityCollection任务的说明

时间:2019-04-26 18:35:46

标签: java c# algorithm

我有以下任务:

  

准则:您可以用Java / C#来实现您的解决方案。

     
      
  1. 要求您实现在附件Java文件中指定的EntityCollection接口。
  2.   
  3. 您的实现应支持以下操作:
      一种。添加-将作为输入提供的实体添加到集合中。
      b。删除最大值-从以下位置删除具有最大值的实体   收集并返回。
  4.   
  5. 对于以下用例(A-C),应根据执行“添加和删除最大值”的频率提供3种实现方式   这些用例的价值:

         

    enter image description here

  6.   
     

每个用例实现应根据其WC进行优化   时间复杂度-

     
      
  • 如果一个操作比另一个操作更频繁(例如,高对低)–那么频繁操作应具有最低的   可能的复杂性,而其他操作可能会更高   复杂性,但仍尽可能优化。

  •   
  • 如果两个操作都是同等频繁的(例如,中级与中级),则两者应具有相似的复杂度,并且应尽可能地降低   在每个操作中,同时还要考虑相同的需求   其他操作的复杂性。

  •   
     

给定的Java代码:

public interface Entity
{
  public int getValue();  // unique
}

public interface EntityCollection
{
  public void add(Entity entity);
  public Entity removeMaxValue();
}
     

注意:您可以使用自己现有的任何集合/数据结构   解决方案。

我的问题:您认为这项任务足够清楚吗?我对如何解决这个问题感到有些迷惑。

我认为他们要我写一些收藏。但我看不到用例/操作的含义。

任何方向提示/代码示例都将不胜感激。

2 个答案:

答案 0 :(得分:1)

IMO,您需要根据用例研究可以有效支持添加或删除操作的数据结构,然后在内部使用您选择的语言来使用相应的内置数据结构,如果您想获得更大的灵活性,则可以实施自己构造数据。

例如,在用例A中,添加频率较高,并且去除最大值freq。值较低,因此您可以使用支持O(1)(恒定时间)时间复杂度的加法的数据结构。而对于删除,您可以使用O(n)(线性时间)时间复杂度或小于O(n^2)的任何东西对于低频操作来说已经足够。

因此,对于用例A,您可以利用链接列表,因为加法O(1),但是对于remove-max,您需要先排序然后再删除max,这会使O(nlogn)变得复杂。

对于用例C-您可以选择使用优先级队列,该队列具有O(1)用于删除最大值,O(log n)用于添加。优先级队列是Java内部的最大堆实现。

答案 1 :(得分:1)

这项工作的重要性在于您对数据结构和算法的理解。

是否进行了大量添加而不是删除最大值?使用链接列表。链接列表是O(1),用于向列表添加新值。因此使用它,并因为第二次操作不常用而对第二次操作使用易于实现的搜索算法。

对于第二个用例,您需要平衡两个操作的速度,因此选择一个对两个操作都具有适当速度的数据结构。也许是二叉搜索树。

以此类推,最后一种情况。

这是一个很好的链接,概述了数据结构及其速度Cheat Sheet

您可以为其中一些选择一个哈希表,但是请注意,尽管哈希表速度很快,但要消耗它却要消耗大量内存。但是,只有在内存有问题或您正在使用大型数据集时,这才是一个问题。