我有以下任务:
准则:您可以用Java / C#来实现您的解决方案。
- 要求您实现在附件Java文件中指定的EntityCollection接口。
- 您的实现应支持以下操作:
一种。添加-将作为输入提供的实体添加到集合中。
b。删除最大值-从以下位置删除具有最大值的实体 收集并返回。对于以下用例(A-C),应根据执行“添加和删除最大值”的频率提供3种实现方式 这些用例的价值:
每个用例实现应根据其WC进行优化 时间复杂度-
如果一个操作比另一个操作更频繁(例如,高对低)–那么频繁操作应具有最低的 可能的复杂性,而其他操作可能会更高 复杂性,但仍尽可能优化。
如果两个操作都是同等频繁的(例如,中级与中级),则两者应具有相似的复杂度,并且应尽可能地降低 在每个操作中,同时还要考虑相同的需求 其他操作的复杂性。
给定的Java代码:
public interface Entity { public int getValue(); // unique } public interface EntityCollection { public void add(Entity entity); public Entity removeMaxValue(); }
注意:您可以使用自己现有的任何集合/数据结构 解决方案。
我的问题:您认为这项任务足够清楚吗?我对如何解决这个问题感到有些迷惑。
我认为他们要我写一些收藏。但我看不到用例/操作的含义。
任何方向提示/代码示例都将不胜感激。
答案 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
您可以为其中一些选择一个哈希表,但是请注意,尽管哈希表速度很快,但要消耗它却要消耗大量内存。但是,只有在内存有问题或您正在使用大型数据集时,这才是一个问题。