给定一个非负整数 n 和用户定义的任意一组不等式(比如外部文本文件),我想确定 n 是否满足任何不等式,如果满足,是哪一个。
这是一个积分列表。
n = 0: 1
n < 5: 5
n = 5: 10
如果您画一个等于 5 的数字 n,您将获得 10 分。
如果 n 小于 5,您将获得 5 分。
如果 n 为 0,则获得 1 分。
冒号左边的东西是“条件”,而右边的东西是“值”。
所有条目将采用以下形式:
n1 op n2: val
在这个系统中,平等优先于不平等,因此它们出现的顺序最终将无关紧要。输入是非负整数,尽管中间值和结果可能不是非负数。结果甚至可能不是数字(例如:可能是字符串)。我将其设计为只接受最基本的不等式,以便更容易编写解析器(并看看这个想法是否可行)
我的程序有两个组件:
一个解析器,它将读取结构化输入并构建一个数据结构来存储条件及其相关结果。
一个函数,它将接受一个参数(一个非负整数)并返回结果(或者,在示例中,我收到的点数)
如果列表是硬编码的,这很容易:只需使用 case-when 或 if-else 块,我就完成了。但问题没有那么简单。
回忆顶部的列表。它可以包含任意数量的(不)等式。可能只有3个像上面这样。也许没有,或者可能有 10、20、50 甚至 1000000。本质上,你可以有 m 个不等式,因为 m >= 0
给定一个数字 n 和一个包含任意数量的条件和结果的数据结构,我希望能够确定它是否满足任何条件并返回相关值。与上面的示例一样,如果我传入 5,该函数将返回 10。
它们的条件/值对在其原始形式中并不是唯一的。您可能有多个相同(不)相等但具有不同值的实例。例如:
n = 0: 10
n = 0: 1000
n > 0: n
注意最后一个条目:如果 n 大于 0,那么它就是你得到的任何值。
如果满足多个不等式(例如:n > 5、n > 6、n > 7),则应返回所有不等式。如果无法有效地做到这一点,我可以只返回第一个满意的并忽略其余的。但我希望能够检索整个列表。
我一直在考虑这个问题,我想我应该使用两个哈希表:第一个将存储等式,而第二个将存储不等式。
平等很容易处理:只需将条件作为键并有一个值列表。然后我可以快速检查 n 是否在哈希中并获取适当的值。
但是,对于不平等,我不确定它会如何运作。有谁知道如何以尽可能少的计算步骤解决这个问题?很明显,我可以在 O(n) 时间内轻松完成此任务:只需逐个(不)等式运行它。但是,如果这种检查是实时完成的,会发生什么?(例如:不断更新)
例如,很明显,如果我有 100 个不等式,其中 99 个检查值 > 100,而另一个检查值 <= 100,那么当我通过 47 时,我不必费心检查这 99 个不等式。
您可以使用任何数据结构来存储数据。解析器本身不包含在计算中,因为这将被预处理并且只需要执行一次,但是如果解析数据花费的时间太长可能会出现问题。
由于我使用的是 Ruby,因此在“处理”数据以及如何解释数据时,我可能有更灵活的选择。