假设您有一个已经排序的整数列表,例如(1,7,13,14,50)。应该注意的是,该列表不包含重复项。
是否有一些数据结构可以存储这个,同时允许我在恒定时间内添加任何新元素(在它的正确位置)? add(10)会产生(1,7,10,13,14,50)。
同样,我能否更新元素(例如更改7到19)并相应地在恒定时间内移动顺序?变化(7,19)收益率(1,13,14,19,50)。
对于一个类,我需要编写一个尽可能快地执行这些操作的数据结构,但我只想知道是否可以完成恒定时间,如果没有,那么理想运行时是什么?
答案 0 :(得分:3)
要在常量时间O(1)中插入,这只会作为任何数据结构的最佳情况。散列表通常具有最佳插入时间,但如果存在冲突并且存在单独的链接,则它可能不总是O(1)。你没有对哈希进行排序,因此复杂性是无关紧要的。
二叉树具有良好的插入时间,并且作为奖励,它在插入新节点时已经被分类。然而,这需要平均O(logn)时间。如果树是空的,插入的最佳情况是O(1)。
这些只是几个例子,请点击此处了解有关这些操作的复杂性的更多信息:http://bigocheatsheet.com/
答案 1 :(得分:0)
一般情况下?确定在插入后确定插入新元素或重新排序列表的位置涉及执行列表内容的分析,这涉及读取列表的元素,这通常意味着迭代列表长度的某些部分。这(一般来说)取决于列表中有多少元素,根据定义,它们不是常量。因此,除特殊情况外,根本不可能进行恒定时间排序的插入。
答案 2 :(得分:0)
二叉树TreeSet就足够了。使用Arrays.binarySearch和Arrays.copy的数组也可以,因为这里我们有整数,然后我们不需要包装类Integer。
对于实际恒定时间,O(1),必须在太空中支付。使用 BitSet 。要添加17,只需将17设置为true即可。有优化的方法可以找到下一个设置位等等。
但我怀疑在这个地方真的需要优化。文件I / O可能会带来更多回报。