【发布时间】:2012-01-17 00:21:23
【问题描述】:
我正在尝试找到一种算法,其中可能包含 C、C++、C#、Java 或任何语言的示例,以帮助解决我一直面临的重新排序问题。
目标是在一个文件中获取一系列范围,并以新的模式重新组织,基本上是在不破坏数据完整性的情况下移动数据片段。我希望找到一个可以就地执行它并使用单个缓冲区进行交换或直接从一个地方移动到另一个地方的缓冲区。只要范围在完成时具有相同的长度和数据完整性,重组过程就可以将范围分解为多个部分。
举个例子,给定一组值:
Length SrcStart Src End Dst Start Dst End
9178 274054 283231 0 9177
274051 0 274050 9178 283228
582929 283229 866157 283229 866157
399208 874397 1273604 866158 1265365
8239 14675709 14683947 1265366 1273604
986980 1273605 2260584 1273605 2260584
602862 2811144 3414005 2260585 2863446
138712 4092072 4230783 2863447 3002158
116210 3414007 3530216 3002159 3118368
550559 2260585 2811143 3118369 3668927
561856 3530217 4092072 3668928 4230783
24319165 4230784 28549948 4230784 28549948
578539 30246149 30824687 28549949 29128487
491856 28549949 29041804 29128488 29620343
593580 29639113 30232692 29620344 30213923
597308 29041805 29639112 30213924 30811231
13456 30232693 30246148 30811232 30824687
633513 31407949 32041461 30824688 31458200
583261 30824688 31407948 31458201 32041461
40117358 32041462 72158819 32041462 72158819
需要将 SrcStart -> SrcEnd 范围内的所有内容移至 DstStart -> DstEnd 范围。请注意,在许多情况下,从 Source 转移到 Destination 会导致 Destination 的内容被更改,由于所需的原始数据已被破坏,您无法再从该位置复制这些内容。
目标是将每个数据段从 SrcStart 移动到 DstStart,其中 Length 在第一列。每行对应的“结束”只是开始加上长度减一(因此它是实际的偏移量)。
我做了很多研究,研究了交换值,并分解了与其他值交叉的区域以及容器交换中的容器,但它们似乎不足。因此,结果,这让我回到了我的第一个陈述,我希望也许有一种算法或一些资源可以帮助我解决这个问题,而社区的共享知识似乎就是这样去。
谢谢!
【问题讨论】:
-
您是否考虑过将值读入 Dictionary
或 HashTable 或 List 或 SortedList 如果您从文件中读取,您应该能够快速加载数据从文件到一个集合或多个列表或多个哈希表,并在该列表上使用添加、删除、排序方法。我假设数据的布局就像文件中的那样..?如果情况更糟,您始终可以使用字段名称创建一个枚举并使用枚举的 (int) 值,该值将表示枚举中声明的字段名称作为标题布局。 -
这个移动动作列表实际上是如何计算的?你在整理碎片吗?然后查看此链接:forums.devshed.com/c-programming-42/…
-
我认为你可以跳过最后一行,因为源和目标是相同的:
40117358 32041462 72158819 32041462 72158819哦,还有第 3 行、第 6 行和第 12 行。 -
@DJKRAZE John 正在尝试重新排列表中行指定位置处的数据,他没有尝试重新排列表内容。也许他应该说得更清楚一点。
-
我同意.. 感谢您的澄清,很难从他最初的帖子中收集到这一点。再次感谢大家周末愉快
标签: c# java c++ language-agnostic