Algorithm 设计一种检查组合的算法
我对每天运行的作业有严重的性能问题,我认为我无法改进算法;因此,我将向你解释什么是要解决的问题和我们的算法,也许你有其他更好的解决问题的想法 所以我们要解决的问题是:Algorithm 设计一种检查组合的算法,algorithm,performance,loops,matching,Algorithm,Performance,Loops,Matching,我对每天运行的作业有严重的性能问题,我认为我无法改进算法;因此,我将向你解释什么是要解决的问题和我们的算法,也许你有其他更好的解决问题的想法 所以我们要解决的问题是: 有一套规则,大约12万条 每个规则都有一组代码组合。代码基本上是字符串。所以我们每个规则有8个组合。组合示例:TTAAT;ZZUHH;GGZZU;WWOOF;SSJJW;福勒 有一组对象,~800个对象 每个对象都有一组约200个代码 如果对象中至少包含一个代码组合,我们必须检查每个规则。它的意思是=> loop in Rul
- 有一套规则,大约12万条
- 每个规则都有一组代码组合。代码基本上是字符串。所以我们每个规则有8个组合。组合示例:TTAAT;ZZUHH;GGZZU;WWOOF;SSJJW;福勒
- 有一组对象,~800个对象
- 每个对象都有一组约200个代码
loop in Rules
Loop in Combinations of the rule
Loop in Objects
every code of the combination found in the Object? => create relationship rule/object and continue with the next object
end of loop
end of loop
end of loop
例如,如果我们有两个代码组合的规则:HHGGT;ZZUUF
假设我们有一个带有这个代码的对象:HHGGT;DHZZU;奥伊朱;ZHGTFHHGGT;JUHZTZZUUF;TGRFE;UHZGT;FCDXS
然后我们在对象和规则之间创建一个关系,因为规则组合的每个代码都包含在对象的代码中=>这就是算法必须做的事情
正如您所见,这相当昂贵,因为在最坏的情况下,我们需要120.000 x 8 x 800=7.5亿次
这是真实问题的简化场景;实际上,我们在循环中所做的事情有点复杂,这就是为什么我们必须以某种方式减少它
我试图想出一个解决办法,但我没有任何想法
你看到这里有什么不对劲吗
向您致以最良好的问候并感谢您抽出时间:)如果我理解正确(这是用python编写的),这样做可能会更好: 首先,构建代码到对象的映射。如果每个对象平均有nObj对象和nCodePerObj代码,则需要
O(nObj*nCodePerObj*log(nObj*nCodePerObj)
接下来,迭代规则并在构建的映射中查找每个规则中的每个代码。如果规则中的每个代码都出现某个对象,即规则中的每个代码都在对象的集合交集中,则存在一种关系。因为哈希查找有O(1)平均时间复杂度,集合交集具有时间复杂度O(两个集合长度的最小值)
,这将需要O(规则*ncodeperule*nObjectsPerCode)
,(注意,如果是nObjectsPerCode,而不是nCodePerObj,当一个代码包含在多个对象中时,性能会变得更差)
RULES = [
['abc', 'def',],
['aaa', 'sfd',],
['xyy', 'eff',]]
OBJECTS = [
('rrr', 'abc', 'www', 'def'),
('pqs', 'llq', 'aaa', 'sdr'),
('xyy', 'hjk', 'fed', 'eff'),
('pnn', 'rrr', 'mmm', 'qsq')
]
MapOfCodesToObjects = {}
for obj in OBJECTS:
for code in obj:
if (code in MapOfCodesToObjects):
MapOfCodesToObjects[code].add(obj)
else:
MapOfCodesToObjects[code] = set({obj})
RELATIONS = []
for rule in RULES:
if (len(rule) == 0):
continue
if (rule[0] in MapOfCodesToObjects):
ValidObjects = MapOfCodesToObjects[rule[0]]
else:
continue
for i in range(1, len(rule)):
if (rule[i] in MapOfCodesToObjects):
codeObjects = MapOfCodesToObjects[rule[i]]
else:
ValidObjects = set()
break
ValidObjects = ValidObjects.intersection(codeObjects)
if (len(ValidObjects) == 0):
break
for vo in ValidObjects:
RELATIONS.append((rule, vo))
for R in RELATIONS:
print(R)