Algorithm 什么';评估10000条规则的最快算法是什么?

Algorithm 什么';评估10000条规则的最快算法是什么?,algorithm,Algorithm,我有定价规则来决定给顾客多少折扣。问题是我需要很多规则,比如~10000条规则,如果我为每个客户请求循环所有10000条规则,那么性能会非常慢 我需要检查许多条件才能应用某些折扣: - Product type (clothes, electronics, etc) - Product SKU - Customer location - Search date (e.g. >= 2019-01-01 And <= 2019-01-31) - . - . - . - ~30th con

我有定价规则来决定给顾客多少折扣。问题是我需要很多规则,比如~10000条规则,如果我为每个客户请求循环所有10000条规则,那么性能会非常慢

我需要检查许多条件才能应用某些折扣:

- Product type (clothes, electronics, etc)
- Product SKU
- Customer location
- Search date (e.g. >= 2019-01-01 And <= 2019-01-31)
- .
- .
- .
- ~30th conditions
我还想让每个规则都有优先权。所以,如果规则3的优先级高于规则1,我想使用规则3应用折扣

天真的方法是循环所有10000条规则,并逐个检查每个规则是否符合条件。但是性能会非常差。如果我想再增加10000条规则呢

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

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

这可能有点过分,但当我考虑速度时,我认为,唯一的规则存储为
(规则,折扣)

要使其起作用,您需要对规则标准(产品类型、国家等)进行分类。其次,您需要为每个类别的每个成员分配一个编号(枚举):

国家[澳大利亚=1,新西兰=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]
现在是时候通过以某种形式对数组执行
H()
来检查适用于此的特定规则了。您可以将数字串在一起:

=H(0002300120)
或者,您可以将每个连续数字乘以10的更大幂,然后将它们相加(对于小于25个标准,因为限制为264):


哈希表的美妙之处在于,如果它们有足够的空间开始工作,并且具有良好的哈希函数
H()
和机制(因为并非所有的
H()
每次都是唯一的),
O(N)运行时应该足够了,因为10000不是很多。但是,由于您希望某些规则具有优先级,因此应该在循环之前按优先级对规则进行排序。这样,您就可以轻松地一次遍历所有规则,而无需检查其优先级是否高于另一个规则。我认为,例如,规则3(在您的示例中)的优先级应该高于规则1。否则,你总是会选择规则1,甚至永远不会选择规则3。正如@Someprogrammerdude所说,你可能不需要检查所有10000条规则。这似乎也是一种可能的过早优化。您是否实现并衡量了此规则查找是一个瓶颈?您需要多久进行一次规则查找?如果你需要每分钟做几次,那么除非你在一个非常低端的系统上(比如二三十年前的计算机),否则这不会是一个问题。是的,你可以编译所有的规则来形成一个决策树。如果您的所有规则都基于一些属性和简单的布尔条件,那么创建决策树就不会非常困难。不过,我需要一份更详细的需求清单,然后才能得出答案。这是一个有趣的想法,但我也希望有这样的条件:搜索日期>=2019-01-01和搜索日期
=H(0002300120)
=H(230000 + 120000000)