代表间隔或范围?

时间:2011-12-09 06:13:04

标签: computer-science

通常,无论何时表示任何类型的范围,您都可以选择多种类型的值来选择范围的开头和结尾。例如,如果您想要一个包含整数1,2,3,4,5的范围,您可以选择以下可能的值:

  • 开始= 0,结束= 5(又名开始< x< =结束)
  • 开始= 1,结束= 5(又名开始< = x< =结束)
  • 开始= 0,结束= 6(又名开始< x< end)
  • begin = 1,end = 6(又名开始< = x< end(C ++ STL和许多其他库似乎选择了这个))。

我不确定应该使用哪些措施来选择其中一个选项。

4 个答案:

答案 0 :(得分:3)

我希望有人能给我一个E.W. Dijkstra在这个主题上写的好文章的链接。我设法将正确的搜索字词插入Google,找到了我想要的链接。论文是"Why numbering should start at 0" and also covers why ranges should be represented with a half open interval [begin, end)

基本论点有几个部分:

  1. 直接体验编程环境(Xerox PARC的编程语言Mesa),支持所有4种不同的选择,导致人们在[开始,结束]标准化,因为所有其他选择经常出错。
  2. 如果你的间隔从0开始,那么开头是-1或类似的东西只是尴尬和破碎。这强烈反对从begin开始的间隔(即所有开始< = x选择)。
  3. 用于确定间隔大小的数学计算,用于计算下一个相邻区间的开始,以及一大堆其他类似的东西,如果结束是一个过去的开始,那就很好。例如,大小为end - beginend是下一个相邻区间的begin。计算中出现一个错误的可能性较小。
    • 在相关说明中,空范围为[begin, begin),非常明显。如果双方都关闭,那就必须是相当尴尬的[begin, begin - 1]。你的范围从0开始尤其尴尬。

答案 1 :(得分:1)

我个人会选择

选项
  • 开始= 1,结束= 5(又名开始< = x< =结束)

我喜欢让我的结构尽可能清晰,类似于人类的推理。如果你告诉某人“1到5之间的数字”,那么1和5都应该在集合中。

当然,如果有充分的技术理由使用别的东西为什么不能,但如果没有,我会选择乍一看更容易理解的选项。

答案 2 :(得分:1)

我会说这取决于你试图表达的间隔的(暗示或显式)类型。对于浮点数和有理数,我认为我更喜欢半开区间(因此,基本上是min <= value < maxmin < value <= max)。对于积分值,开放,闭合和半开放区间之间的转换是微不足道的,所以我可能也会在那里使用半开区间。

答案 3 :(得分:0)

有趣的问题。我想建议,因为foreach loop现在非常普遍,选择的内容变得不那么重要了。您可以在不知道底层实现使用哪个范围约定的情况下循环访问集合。