评估10,000条规则的最快算法是什么?

时间:2018-11-03 03:35:30

标签: algorithm

我有定价规则来确定要给客户多少折扣。问题是我需要很多规则,例如约10,000条规则,如果我为每个客户请求循环所有10,000条规则,性能将会非常慢。

要申请某些折扣,我需要检查很多条件:

- Product type (clothes, electronics, etc)
- Product SKU
- Customer location
- Search date (e.g. >= 2019-01-01 And <= 2019-01-31)
- .
- .
- .
- ~30th conditions

以下是我要设置的规则示例:

Rule 1: product type = 'clothes', then discount 10%
Rule 2: product type = 'electronics', then discount 5%
Rule 3: product type = 'clothes' AND customer location = 'AUSTRALIA', then discount 7%
.
.
.
Rule 10,000: ....

我还要使每个规则具有优先权。因此,如果规则3的优先级高于规则1,我想使用规则3进行折扣。

天真的方法是循环所有10,000条规则,并逐一检查每个规则是否符合条件。但是性能会很差。如果我想再添加10,000条规则,该怎么办?

我很想知道是否有更好的方法来代替循环所有规则。

---更新 每当用户进行搜索时,都需要触发此规则。有一个搜索栏,用户可以输入要查找的关键字,该页面将返回所有与关键字匹配的产品。结果最多可以搜索到50种产品,因此我们需要评估50倍的规则,以适用于每种用户搜索的每种产品。

1 个答案:

答案 0 :(得分:1)

这可能有点过大,但是当我考虑速度时,我认为Hash Tables中,唯一规则存储为(rule, discount)对。

要执行此操作,您需要对规则条件进行分类(产品类型,国家/地区等)。其次,您需要为每个类别的每个成员分配一个数字(枚举):

Countries[Australia = 1, New Zealand = 2, ...]

然后,将具有多个可接受条件的所有规则拆分为单独的规则:

Rule 3: product type = 'clothes' AND (customer location = 'AUSTRALIA' OR customer location = 'NEW ZEALAND'), then discount 7%

成为

Rule 4: product type = 'clothes' AND customer location = 'AUSTRALIA', then discount 7%
Rule 5: product type = 'clothes' AND customer location = 'NEW ZEALAND', then discount 7%

现在,您需要检查一系列条件。如果未指定,则可以保留零。例如,条件数组:

[product type, customer location, month]

您可以拥有价值

['decorations', '', 'December']

翻译成

[23, 0, 12]

,如果您总共要检查8种类型的条件,那么您将拥有一个看起来像这样的最终数组

[0, 0, 0, 23, 0, 0, 12, 0]

现在是通过以某种形式在数组上执行hash function H()来检查适用于此规则的特定规则的时候了。您可以将数字串在一起:

=H(0002300120)

或者您可以将每个连续的数字乘以10的更大的幂,然后将它们加在一起(由于2 64 的限制,少于25个标准):

=H(230000 + 120000000)

哈希表的优点在于,如果它们有足够的开头空间并且具有良好的哈希函数O(1)collision resolving机制,它们几乎可以立即与H()一起工作(因为并非所有H()每次都可能是唯一的。