- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试了解快速排序的外部版本(当数据无法装入主内存时)。我找到了 following link和关于 Wiki 的类似解释外部快速排序过程:
Definition: Read the M/2 first and last elements into a buffer (the buffer acts like the pivot in quicksort), and sort them. Read the next element from the beginning or end to balance writing. If the next element is less than the least of the buffer, write it to available space at the beginning. If greater than the greatest, write it to the end. Otherwise write the greatest or least of the buffer, and put the next element in the buffer. Keep the maximum lower and minimum upper keys written to avoid resorting middle elements that are in order. When done, write the buffer. Recursively sort the smaller partition, and loop to sort the remaining partition.
我理解有问题:
M
是指主存的大小吗?我在某个驱动器上还有剩余的 N-M
元素?
缓冲区就像快速排序中的枢轴
- 这是否意味着我需要将驱动器中剩余的 N-M
元素分成两部分 a
和 b
,其中 a
中的元素低于缓冲区中的所有元素,而 b
中的元素大于或等于最大值来自缓冲区的元素?
从开头或结尾读取下一个元素以平衡书写。
平衡书写 是什么意思?应该从缓冲区(内存)还是从驱动器读取下一个元素?
否则写入最大或最少的缓冲区,并将下一个元素放入缓冲区
- 如果我将下一个元素放入缓冲区(已经排序),我需要再次对缓冲区进行排序吗? 一些示例如何工作或更好的解释将非常有用。
最佳答案
注意 - 我不知道有任何库使用快速排序进行外部排序,所以这主要是一种教育练习。
维基文章提到了磁带,但这是错误的。不可能在合理的时间内从磁带上的数据“两端”读取数据,并且不可能在不破坏数据之后的现有数据的情况下覆盖磁带上的数据。因此,请将其视为硬盘驱动器或 SSD 类型设备上文件的外部排序,具有随机访问和就地覆盖数据的能力。
Is
M
refering to the size of main memory?
根据上下文,工作内存区域的大小为M·sizeof(element)。需要有额外的可用内存才能在不覆盖缓冲区的情况下读取元素。
'N-M` elements on some drive?
是的,因为内存只能容纳M个元素,所以N-M个元素留在外接设备上。
The buffer acts like the pivot in quicksort?
缓冲区被排序为单次运行,缓冲区中的最小值和最大值加上刚刚读取的一个元素作为一个枢轴值范围,以确定写入哪个元素。
Read the next element from the beginning or end to balance writing.` What does it mean to balance writing? Should next element be read from the buffer (memory) or from the drive?
在文件的开头或结尾有可以写入M/2个元素的空间。可以从任一端读取第一个元素读取。如果从头读取一个元素+M/2。然后缓冲区中最小的元素从头开始写入,仍然为要写入的元素留出 M/2 空间。如果从末尾读取元素 - M/2,则将最大元素写入文件中的最后一个元素,并在末尾留出 M/2 空间用于写入元素。
此时算法有问题。每读取一个元素,都需要合并到M个元素的缓冲区中,非常慢。此问题的一种解决方案是为缓冲区使用最小-最大堆。
https://en.wikipedia.org/wiki/Min-max_heap
最终,文件从两端开始写入,在中间 M 元素处相遇,然后写入 M 元素缓冲区。此时,文件开头的所有元素都小于或等于文件结尾的所有元素,文件可以认为是2个分区。然后对每个分区进行分区,产生 4 个分区,然后是 8 个分区,依此类推,直到最终一个分区适合内存并使用正常的内存排序。
所描述的算法很慢,因为它一次读取和写入一个元素。预留一部分内存来缓冲分组读写会快很多。
关于algorithm - 外部quicksort算法讲解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55829044/
如何指示 webpack 排除所有 d3 模块? // does not work externals: { "d3-*": "d3" } 所以如果应用导入了d3-submod
这个问题在这里已经有了答案: 9年前关闭。 Possible Duplicate: What does “outer =>” really mean? 我在哪里可以找到有关信息 trait After
这是一个简单的循环,我正在尝试对性能进行基准测试。 var extremeLoop=function(n){ var time=new Date() var t=0; for(
问题+概述 下面是两个片段,其中包含最初隐藏的 div,然后通过单击 button 和 jQuery 的 .show() 显示。两个 div 都具有由外部样式表应用的 display: grid; 样
我有一个 HTML 页面和一个单独的 .js 文件,该文件包含在带有 的页面中标签。 这是我的 .js 文件: element = document.getElementById("test");
我在 linux 静态库项目中有 3 个文件,我想在两个类方法实现文件中使用的静态字段存在链接问题。我有 class1.h、class1main.cpp 和 class1utils.cpp。 clas
我正在尝试将颜色背景更改为默认背景颜色,当我点击输入框外 我尝试使用“null”或“none”但没有用? window.addEventListener('click', outsideClick);
我正在编写一个应用程序,要求用户在手机上选择各种类型的文件。我使用此代码启动文件选择器 Intent : Intent intent = new Intent(Intent.ACTION_GET_C
在 android 中,不可移动(内部)的外部存储和内部存储有什么区别?我不确定在哪里保存我的数据。我只需要保存一个人可以随时提取的游戏统计数据 谢谢 最佳答案 在许多较新的设备中,将不再有物理区别,
在 C++ 中,假设我们有这个头文件: myglobals.h #ifndef my_globals_h #define my_globals_h int monthsInYear = 12; #en
我正在尝试使用 externs 在 C++ 中连接到 Ada。这两种实现有什么区别? 实现A namespace Ada { extern "C" { int getN
这个问题在这里已经有了答案: Get selected element's outer HTML (30 个答案) 关闭 2 年前。 想象一下我们有这样的东西: Hello World 如果我们这样
假设我在模块的顶部有这个: Public Declare Function getCustomerDetails Lib "CustomerFunctions" () As Long 如果我从 VB6
我目前正在使用这段代码: var wordRandomizer = { run: function (targetElem) { var markup = this.creat
我们正在使用 SVN 试水,并以 Beanstalk 作为主机。我们的设置如下所示: 存储库:模块 模块一 模块二 模块 3 存储库:网站1 自定义网站代码 svn:对模块 1 的外部引用 svn:对
有没有办法在负载均衡器中设置自动外部 IP 分配给像谷歌这样的服务? 我在裸机上运行 Kubernetes。 谢谢 最佳答案 使用 nodePort 类型的服务,它会将您的服务绑定(bind)到所有节
是否有可能在 Controller 之外使用 generateUrl() 方法? 我尝试在带有 $this->get('router') 的自定义存储库类中使用它,但它没有用。 更新 我在这里找到了一
我目前正在尝试通过 Webpack 外部对象外部化 Angular 依赖项来缩短构建时间。到目前为止,我已经为 React 和其他小库实现了这一目标。 如果我只是移动 '@angular/compil
我想创建一个自动应用其他插件的插件(外部插件)。这要求在我称为“应用插件”之前为插件设置构建脚本依赖项。但是似乎我无法在插件中添加buildscript依赖项,或者得到了: 您不能更改处于未解析状态的
我是R包的创建者EnvStats . 有一个我经常使用的函数,叫做 stripChart .我刚开始学习ggplot2 ,并在过去几天里仔细研究了 Hadley 的书、Winston 的书、Stack
我是一名优秀的程序员,十分优秀!