【问题标题】:Trying to retrofit values from lists to return multiple solutions尝试从列表中修改值以返回多个解决方案
【发布时间】:2014-03-31 01:57:37
【问题描述】:

这是一个有点奇怪的要求,请耐心等待。

我有两个值 X 和 Y,它们来自三个可能的范围列表。一个列表是 X 值的范围,一个列表是 Y 值的范围,最后一个列表是 X 和 Y 值组合的范围。

我需要做的是找到所有可能的解决方案。

一个例子可能会让事情更清楚吗?

X 范围

答:11-13; 乙:14-16; C:17-19; D:20-22。

Y 范围

答:11-28; B:29-46; C:47-64。

X、Y 范围

答:6-7、6-14; B:8-9、15-23; C:10-11、24-32。

X = 25,Y = 67

所以一种解决方案是:

  • X 范围 = B,X = 14
  • Y 范围 = B,Y = 35
  • X、Y 范围 = C、X、Y = 11、32

另一种解决方案是:

  • X 范围 = B,X = 15
  • Y 范围 = B,Y = 43
  • X、Y 范围 = C、X、Y = 10、24

我目前的解决方案是将三个范围放入列表中,然后使用蛮力尝试每一个组合,拒绝任何没有给出正确答案的组合。这意味着绝大多数解决方案都会产生无效的结果。

考虑到浪费的努力,这实际上表现得还不错。问题是我需要让这个列表比我的示例更长,并且可能跨越多个变量。

我的蛮力解决方案将适用于更复杂的要求,但它开始变得非常缓慢。

有没有更优雅的方法来解决这个问题?

【问题讨论】:

  • 排序范围是否会有所帮助,也许是低限,这样您就可以提前退出循环?
  • 是的,这会有所帮助,而且我可能还可以做其他事情来使蛮力解决方案更有效地工作。但是,我真的希望我在这里缺少一些东西,并且有一种从根本上更好的方法来做到这一点。
  • 所以你首先建立列表的所有组合,然后拒绝错误的答案?你能把这些步骤倒过来吗?

标签: c# algorithm


【解决方案1】:

1.问题说明

  • 我不确定我是否遵循您的解决方案,以便澄清:
  • 我假设 X=25,Y=67 是输入值
  • 但 X 和 Y 不在您的任何输入范围内
  • 您是否找到作为输入提供的任何 X、Y
  • 同时匹配某个 X,Y,XY 范围?

2.所以你需要加快寻找重叠区间

  • 为了加快在列表中的搜索,您可以使用排序列表
  • 为每个范围列表创建 2 个索引列表
  • 按开始升序排序
  • 秒按停止值降序排序
  • 在此之后您还可以实现二分查找
  • 示例:

    range list:   A(1-10), B(5-7), C(22-30), D(5-8)
    sorted list1: A, B, D, C
    sorted list2: C, A, D, B
    
  • 现在我想找到所有涵盖值 10 的区间

  • 所以制作 2 个解决方案列表,每个排序列表一个

    start <= 10: A,B,D
    stop  >= 10: A,C
    
  • 现在的解决方案是只选择两个列表中的范围

    solution: A
    
  • 您可以根据自己的问题进行调整

  • 乍一看,这似乎是更慢更复杂的方法
  • 但由于使用了二分搜索,搜索速度很快
  • 您实际上不必在内存中有 2 个解决方案列表,它们实际上只是 2 个起始索引
  • 每个排序索引列表一个

【讨论】:

    猜你喜欢
    • 2012-07-15
    • 2022-09-27
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    相关资源
    最近更新 更多