我需要帮助在数据库中找到所有可能的值组合,例如我有这个表:
ITEM_SET Support
I1 0.244999999
I2 0.274999999
I3 0.258333333
I4 0.103333333
我需要找到所有可能的组合:
I1,I2 I1,I2,I3 I1,I2,I3,I4
I1,I3 I1,I2,I4
I1,I4 I1,I3,I4
I2,I3 I2,I3,I4
I2,I4
I3,I4
*请注意,这种格式只是为了帮助阅读,因为我需要的只是一个可能的组合列表,如下表:
ITEMSET
I1
I2
I3
I4
I1,I2
I1,I3
I1,I4
I2,I3
I2,I4
I3,I4
I1,I2,I3
I1,I2,I4
I1,I3,I4
I2,I3,I4
I1,I2,I3,I4
答案 0 :(得分:3)
你建议的是一个n!长度为1-n的所有元素的组合。忽略使用代码生成器创建元素的可能性,你可以为每个组合做这样的事情(在MySQL中):
一项:
SELECT item from ITEM_SET;
两项:
SELECT one.item,two.item from ITEM_SET as one, ITEM_SET as two where one.item != two.item;
三项:
SELECT one.item,two.item,three.item from ITEM_SET as one, ITEM_SET as two, ITEM_SET as three where one.item != two.item and one.item != three.item and two.item != three.item;
冲洗并重复。为了迂腐,我将 ITEM_SET 定义为我的表名,将 item 定义为我的属性,这是一个更有意义的表组合。
这个和相关的问题对我来说是代码味道。如果您以编程方式为所有候选答案遍历所有元素排列,那么可能会有一个更简单的算法来解决您的问题。鉴于您的other question与此直接相关,也许您可以提供更多背景信息?
答案 1 :(得分:1)
生成组合的最简单算法之一是位计数 的伪代码强>
N items, indexed 1-N
for i=1 to 2^N-1
for each bit in i
if bit is set, output item[i]
N = 4的例子:
N = 4, 2^4 = 16
i = 1: binary = 00000001 -> output I1
i = 2: binary = 00000010 -> output I2
i = 3: binary = 00000011 -> output I1, I2
i = 4: binary = 00000100 -> output I3
i = 6: binary = 00000101 -> output I1, I3
i = 7: binary = 00000111 -> output I1, I2, I3
i = 8: binary = 00001000 -> output I4
i = 9: binary = 00001001 -> output I1, I4
i = 10: binary = 00001010 -> output I2, I4
i = 11: binary = 00001011 -> output I1, I2, I4
i = 12: binary = 00001100 -> output I3, I4
i = 13: binary = 00001011 -> output I1, I2, I4
i = 14: binary = 00001110 -> output I2, I2, I4
i = 15: binary = 00001111 -> output I1, I2, I3, I4