1

我有一个场景,我无法在脑海中找到最好的方法,我希望它能给我最大的可扩展性并避免使用幻数编码。

本质上是一个简化的例子。

用户输入一个数字(比如说 5326) 我的系统会将这个数字向下或向上舍入到来自列表的最接近的“可接受值”。我希望这个列表是可配置的。另请注意,不同的变量有不同的列表,例如

可接受高度:1000,2000,3000,4000 可接受长度:500,600,700,800

我能想到的最好的方法来存储这样的值:

<appSettings>
    <add key="acceptableHeight" value="1000,2000,3000,4000" />
    <add key="acceptableLength" value="500,600,700,800" />
</appSettings>

我能想到的逻辑是

  1. 从配置中获取价值
  2. 用逗号分割成整数列表
  3. 对列表进行排序(以防万一)
  4. 某种搜索以找到最接近的值(或使用结束值)

但我不是 100% 确定如何...

4

2 回答 2

0

您需要将列表存储为搜索树。- 创建搜索树将涉及列表的排序。

搜索树是保证中缀树遍历将按排序顺序访问存储值的树。对于二叉搜索树,即每个节点最多有两个孩子的树,这意味着每个节点的值都大于其左子树中的所有节点且小于其右子树中的所有节点。

优选地,搜索树也应该是平衡的,这意味着每个子树都具有接近相等的深度。

有了一个搜索树,在 O(log n) 时间内确定最接近的最大和最接近的较小可接受值对应该是微不足道的。从它们到最接近的值的步骤是基本算术。

- 存在几种实现搜索树的方法,例如参见AVL 树红黑树

c# 中的 avl 树的实现在这里;自平衡avl树

对于您的用例,这实际上是多余的,因为树仅在您启动程序时才会更改。因此,您可能希望为此实现自己的搜索树。

您可以通过首先对列表进行排序然后递归来执行此操作:

  • 如果列表为空,则什么也不做。
  • 选择列表的中间元素
  • 创建一个新节点作为当前树的顶部节点
  • 通过将所选元素之前的数字列表传递给左孩子来创建左孩子。
  • 通过将所选元素之后的数字列表传递给右子元素来创建右子元素。
于 2013-08-28T09:11:11.613 回答
0

您可以将其存储为字符串并按照您的建议进行解析。

int[] acceptableHeight = AppSetting["acceptableHeight"].Split(',').Select(x => int.Parse(x));
于 2013-08-28T09:12:21.407 回答