【问题标题】:algorithm to consolidate overlapping range合并重叠范围的算法
【发布时间】:2018-03-12 07:33:22
【问题描述】:

我的报价配置了折扣值和适用的数量范围。

它可能适用于一个产品的多个优惠,因此我正在寻找算法来整合各种优惠之间的重叠数量范围并显示适用的最终折扣。下面的代码 sn-p 将有助于可视化询问:

class VolumeTierRange
    {
        public int Min { get; set; }
        public int Max { get; set; }
        public int Discount { get; set; }
    } 

/* Offer1Range */
    List<VolumeTierRange> Offer1Ranges = new List<VolumeTierRange>{
                        new VolumeTierRange {Min=1,   Max=20,   Discount=2 },
                        new VolumeTierRange {Min=21,  Max=49 ,  Discount=10 },
                        new VolumeTierRange {Min=50,  Max=100 , Discount=5 },
                        new VolumeTierRange {Min=101, Max=1000, Discount=15}
                    };

/* Offer2Range */
List<VolumeTierRange> dicountBRanges = new List<VolumeTierRange>{
                new VolumeTierRange {Min = 1, Max=50,   Discount=6},
                new VolumeTierRange {Min=51,  Max=1000, Discount=10 }
            };

综合结果如下:

List<VolumeTierRange> effectiveDiscount = new List<VolumeTierRange>{
                new VolumeTierRange {Min=1,  Max=20,  Discount=8 },
                new VolumeTierRange {Min=21, Max=49,  Discount=16},
                new VolumeTierRange {Min=50, Max=50,  Discount=11},
                new VolumeTierRange {Min=51, Max=100, Discount=15},
                new VolumeTierRange {Min=101,Max=1000,Discount=25}
            };

我确实有一些方法可以达到预期的结果,但这些方法似乎都不是很直观。

附加信息:第一项的最小值和所有报价的最大值是固定的(如本例中的 1 和 1000)。定义音量范围时也不能有不连续性。

【问题讨论】:

  • “我确实有一些方法可以达到预期的结果”您应该展示您尝试过的内容,以避免任何人使用您已有的相同解决方案。
  • 因此您需要将整数范围相交并添加几个折扣。是什么阻止了你?
  • 为什么最后一个合并行中的折扣是 15 而不是 25?
  • 是的。有可能
  • @Evk:已更正。

标签: c# algorithm linq


【解决方案1】:

嗯,您要做的第一件事是找出Offer1Ranges 中的哪些值与dicountBRanges 中的哪些值重叠。
当第一项的最小值小于(或等于*)第二项的最大值,而第二项的最小值小于(或等于*)第一项的最大值时,项重叠物品。有关详细信息,请参阅 标签info

根据重叠项目加入列表后,只需简单的选择即可获得两个最小值中的最大值、两个最大值中的最小值以及每个项目的折扣值之和:

var query = from o in Offer1Ranges
            from d in dicountBRanges
            where o.Min <= d.Max
            && o.Max >= d.Min
            select new VolumeTierRange()
            {
                Min = (o.Min > d.Min) ? o.Min : d.Min,
                Max = (o.Max < d.Max) ? o.Max : d.Max,
                Discount = o.Discount + d.Discount
            };

You can see a live demo or rextester.


*在您的情况下,您认为项目重叠,即使它在一个点上(第一个的最小值等于第二个的最大值,反之亦然)。这不是一般情况。

请注意:此解决方案仅适用于两个列表以相同的数字开头和结尾,并且没有间隙,如问题所述:

附加信息:第一项的最小值和所有报价的最大值是固定的(如本例中的 1 和 1000)。在定义音量范围时也不能有不连续性。” p>

【讨论】:

  • 谢谢!!这看起来更干净。可以将其修改为不限于仅两个特定的报价范围。我可以有任何数量的适用于产品的报价。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 2021-05-19
  • 2021-09-28
相关资源
最近更新 更多