求磁盘碎片整理算法

treeroot 2005-08-14 12:01:02
这个是我昨天在topcoder(googlejam) 练习室看道的一道算法题,我昨天想了一天
最后得出一个结论:我想出了一个笨方法,但是不可以用(复杂度为m的n次方),简直
是天文数字,所以我做不出来,原题如下,希望大家能提供一些资料,给点提示.
执行不能超过2秒!

Problem Statement
    
When files are stored on a hard disk, they often become fragmented. This means that the file is not stored in sequential sectors on the disk. The first half of a file might be stored in sector 243, while the second half of a file might be far away in sector 105. The goal of defragmenting a hard drive is to arrange the files so that each file is stored in order on sequential sectors of the disk. Thus, if a file required 4 sectors of storage space, it would end up in sectors N, N+1, N+2, and N+3, for some N. Typically, this is done to increase the overall speed of the computer. There are a number of programs that will defrag a hard disk as described above. However, many of them are painfully slow. You are trying to develop a new algorithm to defrag hard drives, but before you start, you would like to determine how fast you can defrag a very small drive without very many files on it. You will be given the locations of a number of files on a small hard disk, and are to determine the minimum number of sectors that must be moved before the entire drive is defragged. You have enough memory to hold two sectors worth of data at once, but that is all. You will be given a String[], disk, each of whose elements represents a single file. Each element of disk will be formatted as a single-space delimited list of integers which represent the locations of the parts of the file, in order. Hence, the String, "4 9 6 59 41" represents a file stored in 5 sectors where the first part of the file is in sector 4 of the disk. One way to defrag this file would be to move the contents of sector 9 to sector 5, the contents of sector 59 to sector 7, and the contents of sector 41 to sector 8. By doing this, the file would be stored sequentially in sectors 4-8. You will also be given an int, size, representing the total number of sectors on the disk (sectors 0 through size-1, inclusive, may contain data). You are to return the smallest number of sectors that must be moved to defragment the whole disk. Keep in mind that you can not move data to a sector until any data being stored there is moved.
Definition
    
Class:
DiskDefrag
Method:
minMoves
Parameters:
String[], int
Returns:
int
Method signature:
int minMoves(String[] disk, int size)
(be sure your method is public)
    

Constraints
-
size will be between 10 and 100, inclusive.
-
disk will contain between 1 and 12 elements, inclusive.
-
Each element of disk will contain between 1 and 50 characters, inclusive.
-
Each element of disk will be a single-space delimited list of integers, without extraneous leading zeros.
-
Each integer in disk will be between 0 and size-1, inclusive.
-
No integer will be appear more than once in disk.
Examples
0)

    
{"3 4 5 6 8 9 10","17 16 15"}
20
Returns: 5
We can defrag the first file by moving the contents of sector 8 to sector 7, then 9 to 8, and finally 10 to 9. The second file can be defragged in a number of ways by moving the contents of two sectors, for a total of 5.
1)

    
{"1 2 3 5 4 6 7 8"}
10
Returns: 2
Here we can take advantage of the fact that we have enough memory to hold two sectors worth of data. First, load the contents of sectors 4 and 5 into memory. Now, simply write the data back in the reverse order.
2)

    
{"1 3 5 7","0 2 4 8","6 9"}
100
Returns: 7

This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2003, TopCoder, Inc. All rights reserved.
...全文
289 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jstxqgb 2005-08-23
  • 打赏
  • 举报
回复
好像比较麻烦哦,要解决最短时间问题还有死锁问题一大堆乱七八糟的算法。
看看windows为什么硬盘空间低于15%空间就不允许碎片整理了,算法太麻烦了干脆就不算了。
lz慢慢研究,感觉不是一两天能研究出来的东西。。。
llly1314 2005-08-22
  • 打赏
  • 举报
回复
与其说他是想做一个磁盘整理的程序
到不如说他只是想研究算法而已!
Preamble 2005-08-22
  • 打赏
  • 举报
回复
算法是灵魂!
佩服楼主的English。
也佩服楼主的水平
yezi09 2005-08-22
  • 打赏
  • 举报
回复
佩服佩服,看题目看了我半天!
donnydream 2005-08-21
  • 打赏
  • 举报
回复
用JAVA写?Java的优势不在这里,到C或C++板块看看
TalentXu 2005-08-18
  • 打赏
  • 举报
回复
楼上几位可能没看题吧,这道题根硬件一点关系都没有,纯粹在一个基于磁盘整理的简化模型下讨论算法而已
homesos 2005-08-18
  • 打赏
  • 举报
回复
不懂,这个问题太深奥了

帮顶
tomuno 2005-08-17
  • 打赏
  • 举报
回复
要做一个磁盘整理
windows自带磁盘整理工具,而且还为其他整理工具提供接口
感觉磁盘整理要和操作系统紧密联系
因为不同操作系统的文件管理和目录管理有所不同,你要做的磁盘整理不可能直接和硬件打交道吧?
qxbnit 2005-08-16
  • 打赏
  • 举报
回复
这个。。。。
跟硬件贴边太近了,可怕
======================
老大,你的E文佩服
zzzle 2005-08-16
  • 打赏
  • 举报
回复
两个星的就是牛
hui_feng 2005-08-15
  • 打赏
  • 举报
回复
强,帮你顶一下。
flyxxxxx 2005-08-15
  • 打赏
  • 举报
回复
java区应该很少有搞这个的,你应该去C/C++区
chenweionline 2005-08-14
  • 打赏
  • 举报
回复
顶个
Power Defragmenter是Contig软件而编写的图形界面。Contig是由著名的Sysinternals公司(已被微软收购)出品的磁盘碎片整理程序,因为他们开发的系统小软件是在是太棒了。这个磁盘工具其实是Sysinternals开发的Contig磁盘整理工具的GUI版本,其功能、稳定性、效果可想而知,推荐使用。加上GUI界面,普通用户也能很轻松地使用它。看看微软官方是怎么介绍这个软件的吧: 市场上有许多 NT 的磁盘碎片整理程序,包括 Winternals Defrag Manager。这些工具对执行常规磁盘碎片整理都很有用,但虽然大多数文件都可由这些实用程序进行碎片整理,有些文件则未必。此外,很难确保频繁使用的特定文件能得到碎片整理 - 由于应用的碎片整理产品所使用的碎片整理算法所特有的原因,这些文件可能仍然是零碎的。最后,即使所有的文件都得到碎片整理,随后对关键文件的更改可能导致他们变得零碎。只有通过运行彻底的碎片整理操作,才可能指望他们再次得到碎片整理。 Contig 是一个单个文件碎片整理程序,其目的是使磁盘上的文件保持连续。对于持续被碎片化的文件,或者如果您希望确保碎片数量尽量少,它可以完美地迅速优化文件。 Contig 可以在 NT 4.0 或更高版本上运行。Contig 可以用来整理现有文件的碎片,或者创建指定大小和名称的新文件,并优化其在磁盘上的位置。Contig 使用标准的 Windows 碎片整理 API,因此它不会导致磁盘损坏,即使您在运行时终止它。 作为图形界面,Power Defragmenter本身不能进行磁盘碎片整理,它会调用Contig来进行碎片整理。你需要将“Contig.exe”文件放在Power Defragmenter同一级目录下面。
Auslogics Disk Defrag Pro 4.3.0.0 破解补丁 优化算法4优化算法 有4个磁盘优化算法供您选择。使用优化按访问时间的方法,当你想更快地访问经常使用的文件。为了加快您的系统负载和应用程序启动,使用优化由预取布局算法。如果你只是想进一步减少文件碎片,然后选择“ 更改时间的优化。最后,优化磁盘算法可让您手动指定的文件类型,或者甚至是单个文件应被写入到磁盘的更快的一部分。 脱机碎片整理脱机碎片整理 新的脱机碎片整理引擎,使得它可以进行碎片整理重要的系统文件,通常锁定在Windows运行时不能移动。在系统启动时执行脱机碎片整理,加载操作系统之前。它可以让你简化以下系统文件:文件MFT,页面文件,休眠文件和Windows注册表文件。对系统文件进行碎片整理,让你的Windows更敏感,加快系统装载和整体性能。 可用空间整合可用空间整合 使用可用空间的整合算法的文件碎片大大减慢的过程。这个优化的方法合并成一个大的连续的块,这使得它可以写入新文件无碎片磁盘上的自由空间。请注意,巩固自由空间的同时,该方案还重新整理文件。但你可以设置程序文件进行碎片整理,为了使合并过程中走得更快。 先进的碎片整理算法先进的碎片整理算法 磁盘碎片整理Pro拥有专为启用VSS和SSD驱动器的碎片整理算法。VSS碎片整理算法的目的是尽量减少生长在碎片整理过程中的文件移动造成的VSS存储区。它还减少了覆盖以前的VSS快照的机会。的SSD磁盘碎片整理算法大大降低写操作的数量在碎片整理过程中,允许延长硬盘寿命。 综合报告综合报告 在专业版的新的综合性报告,很容易跟踪所有由程序执行的操作。您可以查看文件和可用空间碎片的程度,最大连续可用磁盘上的可用空间块大小,每个操作过程中处理的文件数量。您还可以跟踪你的磁盘和性能方面的改进,通过图形图表的一般状况。所有报告都可以查看,打印和存储在您方便的格式。 追索管理资源管理 磁盘碎片整理Pro允许您轻松驾驭由磁盘碎片整理过程中产生的对系统资源的负荷。限制使用系统资源的程序,当你在你的电脑,或解除任何限制,更快磁盘碎片整理。有4个预定义的资源使用配置文件,你可以选择。或者,您可以创建自己的个人资料,具体的CPU和磁盘使用限制。您还可以限制启动磁盘碎片整理程序时指定的应用程序运行,或者你的笔记本电脑切换到电池供电。 单文件碎片整理单个文件或文件夹的碎片整理 有时,它使更多的意义只经常使用的文件进行碎片整理,而不是整个驱动器进行碎片整理磁盘碎片整理Pro可以节省您的时间,只有你想要的文件进行碎片整理。它可以让你一个单一的文件,有几个文件或整个文件夹进行碎片整理。某些文件时,需要进行碎片整理,以加快应用程序,有没有必要对整个硬盘进行碎片整理时,此选项很有用。 零散文件列表零散文件列表 磁盘碎片整理Pro中列出了所有的零散文件时,后执行磁盘分析。从列表中选择一个文件,将突出其片段的集群地图上的位置。你可以找到最零碎的文件和它们的路径,通过列表进行排序。该列表还可以让你选择文件进行碎片整理,文件添加到忽略列表。所有你需要做的是列表中的一个文件上单击鼠标右键,并选择您要执行的操作。 碎片整理向导碎片整理向导 有了这么多的磁盘优化算法磁盘碎片整理可供选择,你如何为您的电脑选择合适的人吗?由于碎片整理向导,只需几个简单的点击,这是一个问题。所有你必须??做的就是指定你的目的是什么,大多是使用你的电脑(在家中,办公室,游戏或服务器),你工作多久各类证件,并当您的PC上,但在不使用。这些信息将帮助该方案建议,将工作,以达到最佳的磁盘和系统性能的优化算法。 高级调度高级调度 广泛的调度选项,可以很容易地保持您的硬盘驱动器一贯良好的形状。您可以设置程序准确运行在指定的时间,或者,使用自动碎片整理模式。后者使程序的实时磁盘进行碎片整理和优化,确保文件碎片尽快消除,因为它发生。由于可调的资源使用限制,任何计划任务将不会打扰你,而你的工作或在电脑上播放。
硬盘在使用一段时间后,由于反复写入和删除文件,磁盘中的空闲扇区会分散到整个磁盘中不连续的物理位置上,从而使文件不能存在连续的扇区类。这样,再读写文件是就需要到不同的地方去读取,增加了磁头的来回移动,降低了磁盘的访问速度。久而久之大家就会觉得计算机变得越来越慢了?打开程序时出现程序挂起或不响应?启动或关闭计算机要等很长时间?其实硬盘就像屋子一样更需要常整理,要整理磁盘我们就要用到“磁盘碎片整理程序”这个东西,磁盘碎片整理程序可以对使用文件分配表 (FAT) 文件系统、FAT32 文件系统和 NTFS 文件系统格式化的卷进行碎片整理。不满意微软的Windows碎片整理?今天为大家推荐一款非常不错的磁盘碎片整理软件Advanced Defrag! AdvancedDefrag是一款屡获殊荣的磁盘碎片整理程序,其目的是帮助您处理上述的问题,让您的计算机运行的像新装的一样.该软件采用先进的碎片算法,可对你电脑磁盘上的所有碎片进行快速完整的分析并整理为完整的区块.有效地提高了系统性能,提升您计算机的工作效率。直接高效的碎片整理:增强Windows操作系统性能,加快程序启动时间,提高文件访问速度,维持网络高速访问,延长硬件寿命,避免频繁的更新或重装系统。 Advanced Defrag绝对是您节省金钱和时间的最好选择。 主要特点: 快速彻底的分析和整理计算机硬盘碎片。 实时碎片整理,让你的电脑没有磁盘碎片。 自动启动计划任务,使计算机每天保持优化。 每次进行分析和整理碎片都生成一份详细的网页报告,每进行分析和碎片行动的报告。 简单直观的设计,让一切都简单易用。 支持外部USB设备的整理,兼容所有的Windows系统。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧