设计数据结构以选择键组合的值

时间:2013-02-19 04:57:25

标签: java data-structures combinations

我有一个问题,我分析并推广到这个级别,我需要解决这个问题以获得高效的性能

我收集了来自数据库的大量项目,如1_A_B,2_A,2_B,2_A_C,1_C,1_B,2_B_C等等。

现在,当用户选择 A (他只能选择字母表时,根据数字值应该返回),他需要得到 2 ,因为2_A存在,这意味着可以在选择A

时显示2

如果用户选择 B ,他将同时获得 2,1 ,如果他拿起B_C,他将只获得 2 < / p>

输入顺序是随机的。那么我应该设计多少效率或数据结构以获得最佳性能以保持最佳内存使用

我想与Map<Alphabets,List<Numerics>>一起使用但是字母组合显示Numerics并不容易[B_C和C_B应该返回相同的结果并且会有很多字母组合]

2 个答案:

答案 0 :(得分:1)

我会用

HashMap<String,Integer>

,对于稀疏数据更好。 在输入字符串之前,请对其进行解析。这样B_C和C_B将被认为是相同的 检查是否存在时,还要在检查前进行解析和排序。

编辑: 对于每个输入,您将在哈希表中存储1个元素。例如:在分割和排序为

之后,应输入3_C_A
<"AC",3>

要检查是否存在,例如“C”,您需要搜索哈希映射的键。

Pseudo-code
Foreach(key in hash.keys) {
    Print hash(key) if x found in key
}

内存使用:O(n)
搜索性能:O(n)

答案 1 :(得分:1)

我不知道这是否是解决问题的好方法, 但是如果你的字母表相当有限,我会解析并将每个字母转换成2s的幂。

例如,我指定

A = 1 (2^0)
B = 2 (2^1)
C = 4 (2^2)
D = 8 (2^3)

..等等。

然后,我会使用HashMap<Integer, List<Integer>>来存储数据。 在HashMap中,key是字母表的数值之和,值变为作为数据前缀的数字列表。

例如, 给定1_A_B, 2_A, 2_B, 2_A_C, 1_C, 1_B, 2_B_C

1_A_B将存储在地图[3,{1}]下,2_A将存储在地图[1,{2}]下,依此类推。 因此,给定数据集的映射看起来像

3, {1} //1_A_B
1, {2} //2_A
2, {2, 1} //2_B , 1_B
5, {2} //2_A_C
4, {1} //1_C
6, {2} //2_B_C

输入输入B_C时,您只需查找值为6(B + C)的键,然后返回2作为答案。

上述方法也适用于处理B_C和C_B的情况,因为B_C和C_B的总和是相同的。