java搜索磁盘_磁盘搜索/排序算法

我给你读了这样的问题“如果从域D输入n个数字,那么写下这些n个数字的排序输入的最快方法是什么,前提是你只能在内存中存储k个数字(k

请注意,在您的问题中,您说域D的范围是1到10000.我认为这是过于简单化 . 当n = 10000且输入为范围(无重复)时,这将成为 trivial ,因为您将准确知道每个数字应在排序文件中写入的位置 . 此外,您确切知道该文件的内容是什么,并且您不必阅读输入 . :d

现在如果N(D)不等于n或者你允许重复那么问题会变得有趣 .

如果内存有限,我认为直观的方法是这样做:

1st approach

读取输入后,您可以在写入之前对大多数k1元素进行排序,其中k1是需要对内存中的k个元素进行排序的元素数 .

最终会得到内部排序的f =(n div k1)1个文件 .

然后,您需要从f文件中读取并合并部分排序的数据,将它们写入最终文件 .

不同的排序具有不同的内存要求,并将生成不同数量的必须合并的部分排序的文件 .

合并更多文件将需要更多内存,因为您不知道在哪个文件中可以找到下一个数字 .

2nd approach

如您所知,另一种方法是知道您可以在哪个文件中找到下一个数字 . 这就像放它们在桶中根据它们的大小(通过分类来分配排序),但问题在于,除非您知道如何分发数据,否则很难确定每个桶的范围 .

对于最少数量的文件,每个桶的大小应该是k1 .

假设您对数据分布有所了解,可以这样做,否则您需要对数据进行另一次传递以 Build 切割点 .

对于不知道存储桶大小的一般数据,您不能先将所有数据传递给您(例如,如果您输入的数据必须为数据保留某种排序结构,那么您就不会我知道接下来会发生什么)你基本上必须保留一个索引,比如B树,但这不是最佳的 . 索引针对快速检索进行了优化,并且(其中一些)用于插入少量新元素 .

3rd approach

拥有这么小的域允许简单地计算数字并将其频率写下来 . 如果你可以随机访问输出文件,文件系统缓冲可以处理效率(缓冲是一种算法,可以有效地限制内存使用的磁盘写入,唯一的问题是如果缓冲区的大小小于k数如果选择的位图像结构是最有效的) .

直觉上我会说最好的选择是首先计算分布并计算每个桶的大小和限制 . 然后将文件分成多个桶 . 然后对每个桶进行排序我想通过至少部分地对数据进行排序,同时将数据写入存储桶,可以挤出一些性能 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值