我正在开发一个显示用户输入表单的应用程序。表单中有N个部分,每个部分都有X个单选按钮。提供了一个有效选择的子集,以便用户跨部分工作,其他部分中的按钮根据形成有效子集的可能性启用/禁用。
例如: 第1节有用于选择A,B和C的单选按钮 第2节有选择1,2,3和4的按钮 第3节有用于选择x,y和z的按钮
有效子集是({A,2,z},{B},{B,1,x},{C,4} 用户可以从任何部分开始选择,但我必须根据选择动态地禁用按钮。
对于上面的例子,如果用户以2开头,我只会启用A和z(2也将启用)。我不能使用trie,因为它假定前缀匹配的输入顺序。我可以使用哪种数据结构吗?
答案 0 :(得分:0)
您可以使用类似bitset的容器存储启用单选按钮。如果您使用的是C ++,那么如果在编译时已知大小,则可以使用std::bitset
;如果不是,则可以使用boost::dynamic_bitset
。如果您正在使用其他语言,那么很可能有一个像他们库中已有的容器,如果不是,您可以使用int
的集合手动实现(根据单选按钮需要多个int)。
只需通过单选按钮存储一个bitset
(如果此单选按钮存在于多个有效子集中,则其bitset
将是按位或包含的所有子集,表示仅检查此单选按钮时,位集中指示的单选按钮有效。
当您选择任何第二个单选按钮时,在实际活动单选按钮位集和新激活的选项的位集之间执行按位 - 和选中的单选按钮(预先计算)。这意味着只有至少一个子集中的单选按钮才能激活所有先前选择的单选按钮。
实施例:
假设单选按钮是:A, B, C, 1, 2, 3, 4, x, y and z
它们在哪个部分是相同的。
使用有效集:({A,2,z},{B,2,z},{B},{B,1,x},{C,4})和bitsets
(每个单选按钮一位):
A: 1000100001 B: 0101100101 C: 0010001000
1: 0101000100 2: 1100100001 3: 0000010000 4: 0010001000
x: 0101000100 y: 0000000010 z: 1100100001
当有效子集已知并存储时,可以预先计算此位集,直到它们不再使用为止。
您将以1111111111
开头,全部启用,您应用会检查此变量并启用或禁用单选按钮。
当您选择2
时,活动的单选按钮将为1111111111 and 1100100001 = 1100100001
,您将更新单选按钮状态(仅启用A, B, 2 and z
)。然后,如果您选择A
,然后选择1100100001 and 1000100001 = 1000100001
。 (仅启用A, 2 and z
)。
bitset
可以存储在数组或列表或数组中(逐节),因为编程更容易。