如何排序从大文件中读取的长列表数据(字符串,浮点等)
(说几百万行)使用Data.Vector.Generic.Mutable对象和排序算法
从Data.Vector.Algorithms?

解决方法

在一般情况下,这是如何做到的.

首先,你需要一个可变的向量.你可以逐渐建立这个
你扫描文件;分配一个与您需要的一样大的向量,
并在空间不足时增加大小并复制.或者你可以
读取整个文件,计数记录分隔符,并分配
适量的空间一次.这很容易,但可能不是
在现实生活中可以接受(按需扩展的策略很漂亮
共同;如果你使用像Perl这样的语言和你读的行
从文件到数组的末尾,这是发生了什么. Perl的
为数组分配一些空间,当你填充它,它会增加
空间量,分配新空间和副本.)

无论如何,我太懒了,所以我只是要创建一个向量
其中有一些随机数字.

我们需要一堆图书馆:

import Control.Monad
import System.Random
import qualified Data.Vector as IV
import qualified Data.Vector.Mutable as MV
import qualified Data.Vector.Generic as V
import qualified Data.Vector.Algorithms.Intro as VA

我们不需要这一切,但我们最终需要它,所以我
以为我会把它弄出来.

无论如何,我们的可变向量将是一个“正常”可变向量,
这里MV.MVector.

可变向量的想法是创建它并修改它
步数在Haskell,有几种方法可以让这个外观
纯电话代码;一个是在ST monad里面做的.
您的ST动作正在创建向量,进行修改,并将其“冻结”
成为一个不变的向量.在内部,你使用得很快
修改这个内存位置 – 一堆一次的操作,但是
在外面,你有一些纯粹的东西. (阅读论文
ST,如果你想要一个争论,为什么这是安全的.)

处理可变数据的另一种方法是在其中进行
一切,呃,IO,monad.这就是我们在这里做的
这是最方便的

(Data.Vector.Mutable为您提供了两个预定义的矢量类型,
IOVector和STVector.我们正在使用IOVector,它将所有
向量操作为IO.)

所以就像前面8段,我们将要创建一个可变向量
分类.在这里我们是:

randVector :: IO (MV.IOVector Int)
randVector = do
  v <- MV.new 10
  forM [0..9] $\x -> do
    r <- randomIO :: IO Int
    MV.write v x r
  return v

这是一个IO操作,返回一个10个随机的新的可变向量
里面的数字(随机数生成也可以方便
提升到IO monad,所以我们也这样做,为方便起见!它的
就像我们正在写C,但是更好的语法和更多的类型安全.)

这其实是很难的.做排序,我进口
Data.Vector.Algorithms.Intro基本上就位了
快速排序.一个名为sort的函数实际排序(in
以可变向量为单位).

创建随机可变向量并将其排序的动作
好像:

sort = VA.sort =<< randVector

现在,要打印出来,我们需要做的就是将“载入”进入
一个不可变的向量,并打印出.toList.或者你可以只是
迭代每个元素并打印.

以下是我想出的例子:

main = do
  v <- randVector
  VA.sort v
  iv <- V.unsafeFreeze v :: IO (IV.Vector Int)
  print . V.toList $iv

V.unsafeFreeze来自Data.Vector.Generic(你如何交互
所有矢量类型具有相同的API),以及V.toList.

无论如何,值得注意的是,IO完全是为了方便起见.
由于您正在从文件数据构建向量,所以它是适当的. 99%
当然,你应该使用ST.在您的ST动作中,创建
矢量,排序,冻结,并返回冻结版本.

使用STVector的类似示例:

randVector :: ST s (Vector Int)
randVector = do
  vec <- new 10
  rand <- newSTRef 17
  forM_ [0..9] $\index -> do
    randN <- readSTRef rand
    let randN' = (fst . next . mkStdGen) randN
    writeSTRef rand randN'
    write vec index randN'
  unsafeFreeze vec

然后运行:

*Main> runST randVector
fromList [679560,1422110406,306332632,1905242129,692062628,393451229,355476175,1240028023,873588529,1181443777] :: Data.Vector.Vector

数组 – 如何使用Data.Vector.Generic.Mutable进行排序?的更多相关文章

  1. canvas中普通动效与粒子动效的实现代码示例

    canvas用于在网页上绘制图像、动画,可以将其理解为画布,在这个画布上构建想要的效果。本文详细的介绍了粒子特效,和普通动效进行对比,非常具有实用价值,需要的朋友可以参考下

  2. H5混合开发app如何升级的方法

    本篇文章主要介绍了H5混合开发app如何升级的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. canvas学习和滤镜实现代码

    这篇文章主要介绍了canvas学习和滤镜实现代码,利用 canvas,前端人员可以很轻松地、进行图像处理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  4. html5使用canvas实现弹幕功能示例

    这篇文章主要介绍了html5使用canvas实现弹幕功能示例的相关资料,需要的朋友可以参考下

  5. localStorage的过期时间设置的方法详解

    这篇文章主要介绍了localStorage的过期时间设置的方法详解的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  6. 详解HTML5 data-* 自定义属性

    这篇文章主要介绍了详解HTML5 data-* 自定义属性的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. HTML5的postMessage的使用手册

    HTML5提出了一个新的用来跨域传值的方法,即postMessage,这篇文章主要介绍了HTML5的postMessage的使用手册的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. 教你使用Canvas处理图片的方法

    本篇文章主要介绍了教你使用Canvas处理图片的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. 前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)

    这篇文章主要介绍了前端实现弹幕效果的方法总结(包含css3和canvas的实现方式)的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. H5 canvas实现贪吃蛇小游戏

    本篇文章主要介绍了H5 canvas实现贪吃蛇小游戏,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部