【问题标题】:Distance between two numbers in looping sequence [closed]循环序列中两个数字之间的距离[关闭]
【发布时间】:2012-09-01 19:29:08
【问题描述】:

假设您有一个这样的序列:0、1、2、3、4、5、6、7、0、1、2 等。基本上是一个由 N 个数字组成的序列,一遍又一遍地重复。

找出这个序列中两个数字之间的距离/差的最简单算法是什么?例如距离from 5 to 7 is +2 和距离from 0 to 6 is -2。对于更高级的视图,我有一个循环/重复序列号,我需要找出最近路径上另一个数字的“之前”或“之后”多少(它们之间的数字最少)。

【问题讨论】:

  • 你试过什么。当您找到 number1 时进行迭代,继续使用距离计数器进行迭代。如果你找到 number2 那么你有一个距离。如果找到 number1 则重置距离计数器。保存最小距离计数器。对于 - 只需交换两个数字。
  • 我正在寻找快速的方法,我想出的最好的方法是这样的:n = (from + size) - to; if n > size/2 then n -= size 但它涉及一个分支
  • 数字总是连续的吗?我刚刚意识到我看到了一个更复杂问题的答案
  • 这是一个相关的问题(在 JS 中的实现):stackoverflow.com/questions/38797186/…

标签: c# .net algorithm math


【解决方案1】:

假设 X>Y:

dist(X, Y) = min { X-Y, N-(X-Y-1) }

N = 7 的示例:

dist(7, 5) = min {7-5, 7-(7-5-1)} = min {2, 6} = 2

dist(6, 0) = min {6-0, 7-(6-0-1)} = min {6, 2} = 2

dist(5, 1) = min {5-1, 7-(5-1-1)} = min {4, 4} = 4

最后一个例子指出了距离定义中的一个小缺陷:是 dist(5, 1) = 4 还是 dist(5, 1) = -4 ?我已经稍微改变了你的定义以避免负距离(所以我的算法计算距离的绝对值)。如果你想保持你的定义,那么当且仅当min 的第一个参数大于第二个时,距离为负数。

【讨论】:

    【解决方案2】:

    这很简单,适用于连续和非连续数字,也许可以使它成为一种扩展方法:

    [TestFixture]
    public class NumbersFixture
    {
        [Test]
        public void FindDistance()
        {
            var numbers = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2 };
    
            var num1 = 6;
            var num2 = 0;
    
            var from = numbers.IndexOf(num1);
            var indexFound = numbers.FindIndex(from, f => f == num2);
            var distance = from - indexFound;
    
            var result = string.Format("{0}", distance);
            Console.WriteLine(result);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 2013-08-19
      • 1970-01-01
      相关资源
      最近更新 更多