|      1Michaelssss      2017-02-03 14:08:18 +08:00 linkedhashmap | 
|      2disposablexyz OP @Michaelssss  我有想过那个,但是它的 ordering 是根据 insertion order 而不是 comparator 的,所以不算。 | 
|      3QAPTEAWH      2017-02-03 14:19:35 +08:00 via iPhone 或者谁证明一下这个是不可能的? | 
|  |      4vela      2017-02-03 14:20:40 +08:00 组合一个 TreeMap 和 HashMap 。 | 
|      5Michaelssss      2017-02-03 14:21:37 +08:00 @disposablexyz 那应该没有吧,满足 O ( 1 )这个条件的应该就是 Map 的实现类了,实在不行自己 Override 一下 LinkedHashMap 应该是最快了 | 
|      6luos543      2017-02-03 14:22:25 +08:00 简单来说就是想要 O(n)的有序数据结构? | 
|      7allan888      2017-02-03 14:22:44 +08:00 红黑树吧。 TreeMap ,提供有序 order ,但是查询是 log(n), n 不大的情况下 log(n)估计也能接受了。 | 
|  |      8otakustay      2017-02-03 14:29:36 +08:00 插入和查询都是 O(1)的使用 comparator 的数据结构不存在的吧…… 只查询 O(1),插入可以 O(n)的话用 2 个结构组合起来就行 | 
|      9disposablexyz OP | 
|      10disposablexyz OP @otakustay 插入不需要 O(1),只有查询需要 | 
|      11disposablexyz OP @otakustay 你的意思是说查询用 HashSet ,插入同时插入到 HastSet 和 TreeSet 么 | 
|      12disposablexyz OP @otakustay 然后 return TreeSet 的 iterator ? | 
|      13disposablexyz OP ehhh, by set I mean map | 
|  |      14otakustay      2017-02-03 14:36:28 +08:00 @disposablexyz yes ,内存应该够的吧 | 
|      15disposablexyz OP @otakustay 不大好 | 
|  |      16otakustay      2017-02-03 14:40:57 +08:00 @disposablexyz 你都不说不好在哪里…… | 
|      17luos543      2017-02-03 14:41:55 +08:00 感觉这样的数据结构挺小众的。创建 iteration 的时候才做 sorting ,不会对机器很大负担么? | 
|      18disposablexyz OP @luos543 创建 iteration 的时候才做 sorting 是我能想出来的解决方案,但不一定是这样,也可以在 insert 的时候做。实际上我不需要知道怎么做到,只要求能够有一个 sorted 的 iteration 和 O(1)的查询 | 
|      19allan888      2017-02-03 14:54:45 +08:00 你仅仅是查询加有序遍历,明显 hashmap+treemap 是可以的。 可以做到插入 O(logn), 删除 O(logn), 查询 O(1), 修改 O(logn), 也能有序遍历。 | 
|  |      20bumz      2017-02-03 15:53:26 +08:00 1) 查询任何一个 element 的复杂性是 O(1) —— HashMap 2) 提供有序的 iteration —— TreeMap 一个新的数据结构诞生了:"IterableHashMap",用 HashMap 做查询, TreeMap 提供迭代器。 | 
|      21clarkok      2017-02-03 16:48:41 +08:00 via Android 提供一个思路,用 hash func 是 X % N 的 hash 表?并且冲突的用链表从大到小链起来 | 
|  |      23shyling      2017-02-03 17:16:43 +08:00 选择一个合适的 hash 算法 | 
|      24SuperFashi      2017-02-03 21:00:05 +08:00 | 
|  |      25breeswish      2017-02-04 10:00:02 +08:00 确保 obj1 <= obj2 时 hash(obj1) <= hash(obj2),这样大概就可以有序地 iterate 了 | 
|  |      26bumz      2017-02-04 11:48:50 +08:00 其实 n 很小的时候 O(log(n)) 往往比 O(1) 更快,因为  O(1) 算法前面的常数往往很大,比如 hash 算法 HashMap 是为数据量很大且相互没有什么简单联系的数据准备的。 如果数据量大到连 O(log(n)) 的算法都不够用,那恐怕此时按顺序迭代也没有什么意义了,给你几台超级计算机,从宇宙诞生开始算,算到现在都不见得算得完。 综上,如果按顺序迭代还有意义,那么何不直接利用这一顺序建立数据结构—— TreeMap 呢?此时的 O(log(n)) 完全可以看成 O(1)。 | 
|      27srlp      2017-02-05 10:54:20 +08:00 | 
|  |      28KentY      2017-02-09 19:48:23 +08:00 我觉得 OP 没有描述清楚. 按照我的理解: 如果只关注查询的复杂度, 不管插入的复杂度, 就可以不关心有排序与否, 你完全可以用一个 linkedhashmap, 然后插入你已经排序好的数据, 或者 treemap 也可以, 方便点. 换句话说,你可以用最慢的排序方法, 哪怕是 O(n^n)的, 也与你要求的数据结构没关系, 你只要求了提取数据 O(1), 并且可以按照排好序的方式 iteration. |