Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 设计一种检查组合的算法_Algorithm_Performance_Loops_Matching - Fatal编程技术网

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)