scala外部排序算法

scala 外部排序算法


源代码
/**
  * Created by wilbur on 6/27/17.
  */
import java.io._
import java.util
import scala.util.control.Breaks._

object externalSort {
  def main(args: Array[String]): Unit = {
      val timebegin = System.currentTimeMillis()
      val fr=new BufferedReader(new FileReader("/home/user/inputdata"))//源数据文件读取
      val size=10000000//这里是定义我们将源文件中以10000000条记录作为单位进行分割
      val nums=new Array[Int](size)  //临时存放分割时的记录
      val fileNames=new util.ArrayList[String]()//保存所有分割文件的名称
      var index = 0
      breakable(while(true){
        val num=fr.readLine()//从原文件中读取一条记录
        if(num==null){//如果读取完毕后,进行一次排序并保存
          fileNames.add(sortAndSave(nums,index))
          break
        }
        nums(index)=num.toInt
        index=index+1
        if(index==size){//当nums里面读的数字到达长度边界时,排序,存储
          fileNames.add(sortAndSave(nums,index))//sortAndSave是将nums中前index条记录先快速排序,然后存入文件,最好将文件名返回
          index=0//重置index
        }
      })
      fr.close()
      mergeSort(fileNames)//将所有fileNames的文件进行合并
      val timeover = System.currentTimeMillis()
      println("The merge runtime is  " + (timeover - timebegin) / 1000.0 + "  s"+"\n\n\n")
    }

  //每读取size行的数据后,排序输出
    def sortAndSave(nums:Array[Int],size:Int):String={
      qsort(nums,0,size-1)
      val fileName="/project/sort/temp/"+System.nanoTime()
      val bw=new PrintWriter(new FileWriter(fileName))
      for(i<-nums.indices)
        bw.println(nums(i))
      bw.close()
      fileName
    }

//依次读入两个文件进行归并
    def mergeSort(fileNames:util.ArrayList[String]):Unit={
      val tempFileNames=new util.ArrayList[String]()
      var i=0
      while(i<fileNames.size()){
        val resultFileName="/project/sort/temp/"+System.nanoTime()
        tempFileNames.add(resultFileName)
        val bw=new PrintWriter(new FileWriter(resultFileName))
        val file1=new File(fileNames.get(i))
        val br1=new BufferedReader(new FileReader(file1))
        i+=1
        if(i<fileNames.size()){
          val file2=new File(fileNames.get(i))
          val br2=new BufferedReader(new FileReader(file2))
          var num1:Int=0
          var num2:Int=0
          var isFrist = true
          var firstNext = true
          var numVal1:String=""
          var numVal2:String=""
          breakable(while(true){
            if(isFrist){
              numVal1=br1.readLine()
              numVal2=br2.readLine()
              num1= Integer.valueOf(numVal1)
              num2= Integer.valueOf(numVal2)
              isFrist=false
            }
            else if(firstNext) numVal1=br1.readLine()
            else
              numVal2=br2.readLine()
            if(numVal1!=null&&numVal2!=null){
              if(firstNext){
                num1=Integer.valueOf(numVal1)
              }
              else num2=Integer.valueOf(numVal2)
              if(num1<num2){
                bw.println(num1)
                firstNext=true
              }else{
                bw.println(num2)
                firstNext=false
              }
            }else{
              if(numVal1!=null)bw.println(numVal1)
              if(numVal2!=null)bw.println(numVal2)
              break
            }
          })
          breakable(while(true){
            numVal2=br2.readLine()
            if(numVal2!=null)bw.println(numVal2)
            else break
          })
          br2.close()
          file2.delete()
        }
        breakable(while(true){
          val numVal1=br1.readLine()
          if(numVal1!=null){
            bw.println(numVal1)
          }
          else break
        })
        br1.close()
        file1.delete()
        bw.close()
        i+=1
      }
      val size=tempFileNames.size()
      if(size>1){
        mergeSort(tempFileNames)
      }else if(size==1){
        val file=new File(tempFileNames.get(0))
        file.renameTo(new File("/project/sort/temp/result"))
      }
    }

    def qsort(inputData: Array[Int], left: Int, right: Int): Unit = {  //快速排序
      if (left < right) {
        var i = left
        var j = right
        val x = inputData(i)
        while (i < j) {
          while (i < j && inputData(j) > x) j = j - 1 /* 从右向左找第一个小于x的数 */
          if (i < j) {
            inputData(i) = inputData(j)
            i = i + 1
          }
          while (i < j && inputData(i) < x) i = i + 1 /* 从左向右找第一个大于x的数 */
          if (i < j) {
            inputData(j) = inputData(i)
            j = j - 1
          }
        }
        inputData(i) = x
        qsort(inputData, left, i - 1) /* 递归调用 */
        qsort(inputData, i + 1, right)
      }
    }
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scala 是一种功能强大的静态类型、面向对象和函数式编程语言,它非常适合在 Scala 中实现支持向量机(Support Vector Machine, SVM)算法。SVM 是一种常用的监督学习算法,尤其在分类和回归问题中表现出色,因为它能够找到最优超平面进行决策。 在 Scala 中实现 SVM,你可以使用开源库如 Smile(Scalable Machine Learning Library)或 Breeze(专为 Scala 设计的数值计算库),它们提供了现成的 SVM 实现和相关的工具。 以下是一个简单的步骤概述: 1. **引入库**:如果你还没安装,首先需要添加对应库到你的项目依赖中,例如在 SBT (Scala Build Tool) 项目中添加 Smile 或者 Breeze。 ```scala libraryDependencies += "com.github.haifengl" %% "smile-core" % "2.6.0" ``` 2. **数据预处理**:将数据集转换成适合 SVM 输入的格式,通常包括特征向量和对应的标签。 3. **模型创建**:使用 Smile 或 Breeze 的 SVM 类,如 `LinearSVC` 或 `SMO` 来创建模型。 ```scala import smile.classification._ import breeze.linalg.DenseVector val svm = LinearSVC() ``` 4. **训练模型**:使用数据集对模型进行训练。 ```scala val data = ... // 从文件或数据库读取的数据 val (inputs, labels) = data.map { case features, label => DenseVector(features), label }.unzip svm.train(inputs, labels) ``` 5. **预测和评估**:对新的数据点进行预测,并使用交叉验证等方法评估模型性能。 ```scala val testData = ... // 预测用的数据 val predictions = svm.predict(testData) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值