Scala练习-插值查找

Posted Q博士

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala练习-插值查找相关的知识,希望对你有一定的参考价值。

原理
源码

package day15


import day14.Utils
import day15.BinarySearch.printlnArray

import scala.collection.mutable.ArrayBuffer

/**
  * Created by doctorq on 2017/6/30.
  * 插值查找:改进二分查找的算法,在数值范围比较大,分布比较均匀时可以采用插值查找来取代二分查找
  * 切分的索引值不再是之前的中间位置,根据待查找的数值的权重来计算切分的索引值
  */
object InsertSearch extends App with Utils 
  def search(unSorted: Array[Int], find: Int): Unit = 
    val size = unSorted.size
    if (size == 0) 
      println(s"$find no find")
      return
    
    printlnArray(unSorted)
    val index =
      (size - 1) * (find - unSorted(0)) / (unSorted(size - 1) - unSorted(0))

    val flag = unSorted(index)

    if (find == flag) 
      println(s"find $index")
      return
     else if (find > flag) 
      val right = subArray(unSorted, index + 1, size - 1)
      search(right, find)
     else 
      val left = subArray(unSorted, 0, index - 1)
      search(left, find)
    
  

  def subArray(parent: Array[Int], start: Int, end: Int): Array[Int] = 
    val subArray = new ArrayBuffer[Int]()
    for (i <- start to end) 
      subArray.append(parent(i))
    
    subArray.toArray
  

  val list = Array(1, 3, 4, 2, 5, 5, 6, 9, 3, 4, 4)

  search(list.sorted, 3)


以上是关于Scala练习-插值查找的主要内容,如果未能解决你的问题,请参考以下文章

Scala练习-二分查找

Scala练习-哈希查找

Scala练习-二叉树查找

Scala练习-斐波那契查找

Scala练习-分块查找

scala实现球面插值(Slerp)