首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在循环元素序列中定位第一个元素的最快方法

在循环元素序列中定位第一个元素的最快方法
EN

Stack Overflow用户
提问于 2015-08-11 23:34:02
回答 1查看 48关注 0票数 1

我编写了这个二进制搜索函数,以在索引序列中定位特定的值:

代码语言:javascript
运行
复制
  def locate(xs: IndexedSeq[Int], x: Int, l: Int, h: Int): Int = {
    (l + h) / 2 match {
      case m if h - l <= 1 => l
      case m if x >= xs(m) => locate(xs, x, m, h)
      case m => locate(xs, x, l, m)
    }
  }

当我有一个序列时,它可以工作,例如:

代码语言:javascript
运行
复制
Vector(1,2,3,9,15,26,89)

也就是唯一元素的有序序列。但是,当有序序列中有重复元素时,它不起作用,如:

代码语言:javascript
运行
复制
Vector(1,2,3,3,15,15,89)

不能保证选择循环子序列的第一个元素。例如,如果我想搜索3,它可能不会给出序列中前3的索引。

哪种算法能有效地做到这一点?或者,我可以修改我的二进制搜索序列,使我可以很容易地做到这一点(同时仍然是尾递归)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-12 00:01:40

基于定界的算法,我认为这种更改就足够了:

代码语言:javascript
运行
复制
def locate(xs: IndexedSeq[Int], x: Int, l: Int, h: Int): Int = {
    l+(h-l)/2 match {
        case m if h - l == 0 => l
        case m if xs(m) < x => locate(xs, x, m+1, h)
        case m => locate(xs, x, l, m)
    }
}

我还更改了计算m的代码,因为在极端情况下,原始代码容易发生整数溢出。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31953715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档