C# 对大量长度相同的字符串进行排序
我有一个非常大的字符串序列。每根绳子的长度是50。每个字符串只包含来自英语ABC的字符。排序此序列的最佳(最快)方法是什么?类似的方法C# 对大量长度相同的字符串进行排序,c#,algorithm,sorting,C#,Algorithm,Sorting,我有一个非常大的字符串序列。每根绳子的长度是50。每个字符串只包含来自英语ABC的字符。排序此序列的最佳(最快)方法是什么?类似的方法 List<string> list = new List<string>(); /* fill the list */ list.Sort(); List List=新列表(); /*填写清单*/ list.Sort(); Sort()方法具有不同的重载,允许您自定义执行字符串比较的方式 编辑哦,所谓“大”是指500GB的字符串,那么
List<string> list = new List<string>();
/* fill the list */
list.Sort();
List List=新列表();
/*填写清单*/
list.Sort();
Sort()
方法具有不同的重载,允许您自定义执行字符串比较的方式
编辑哦,所谓“大”是指500GB的字符串,那么这可能不会减少它。类似的东西
List<string> list = new List<string>();
/* fill the list */
list.Sort();
List List=新列表();
/*填写清单*/
list.Sort();
Sort()
方法具有不同的重载,允许您自定义执行字符串比较的方式
编辑哦,所谓“大”是指500GB的字符串,那么这可能不会削减它。如果我必须编码,我可能会根据前几个字符左右,将输入拆分为多个输出文件;其目标是使每个输出文件足够小,以适应主内存。然后我将按顺序打开每个文件,在内存中对其排序,并将其附加到输出中。第一个过程是O(n),第二个过程或多或少是O(n log n),每个记录必须执行四次磁盘I/O。使用一些神秘的算法可能会做得更好,但可能不会太多,这很容易理解和编写代码 如果系统限制一次可以打开的文件数量,则可能需要拆分第一个过程。如果字符串分布不均匀,则某些中间文件可能太大 在伪代码中:
open input file (r)
for i in ['aa', 'ab', 'ac', ..., 'zz']:
open output file[i] (w)
for record in input file:
write record to output file[record[0:2]]
close all files
open main output file (w)
for i in ['aa', 'ab', 'ac', ..., 'zz']:
open input file[i] (r)
slurp whole file into memory
close input file
sort data
append whole sorted file to main output file
编辑:等等,你的意思是记录只包含字符A、B和C吗?没有其他信件了吗?在这种情况下,您可能需要在长度超过2的初始子字符串上拆分。根据前3个字符进行拆分会将其拆分为27个文件,每个文件的平均大小为370MB。如果我必须对其进行编码,我可能会根据前两个字符左右将输入拆分为多个输出文件;其目标是使每个输出文件足够小,以适应主内存。然后我将按顺序打开每个文件,在内存中对其排序,并将其附加到输出中。第一个过程是O(n),第二个过程或多或少是O(n log n),每个记录必须执行四次磁盘I/O。使用一些神秘的算法可能会做得更好,但可能不会太多,这很容易理解和编写代码 如果系统限制一次可以打开的文件数量,则可能需要拆分第一个过程。如果字符串分布不均匀,则某些中间文件可能太大 在伪代码中:
open input file (r)
for i in ['aa', 'ab', 'ac', ..., 'zz']:
open output file[i] (w)
for record in input file:
write record to output file[record[0:2]]
close all files
open main output file (w)
for i in ['aa', 'ab', 'ac', ..., 'zz']:
open input file[i] (r)
slurp whole file into memory
close input file
sort data
append whole sorted file to main output file
编辑:等等,你的意思是记录只包含字符A、B和C吗?没有其他信件了吗?在这种情况下,您可能需要在长度超过2的初始子字符串上拆分。对前3个字符进行拆分会将其分成27个文件,每个文件的平均大小为370MB。您正在寻找的算法可能是合并排序 还有这个 但在您的具体情况下,请阅读以下内容:
它可以为你工作 您正在寻找的算法可能是合并排序 还有这个 但在您的具体情况下,请阅读以下内容:
它可以为你工作 由于500 MB不是很多数据,您只需将整个文件加载到内存中,对其进行排序,然后将结果写回磁盘即可 我假设文件内容的布局如下: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX\r\n ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX\r\n : : ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX\r\n abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxx\r\n abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxx\r\n : : abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxx\r\n 代码:
//加载
var data=File.ReadAllBytes(“File.txt”);
var itemCount=data.Length/52;
var索引=新的整数[itemCount];
对于(int i=0;i
{
对于(int i=0;i<50;i++)
{
if(data[x*52+i]>data[y*52+i])返回1;
if(data[x*52+i]
由于500 MB不是很多数据,您只需将整个文件加载到内存中,对其进行排序,然后将结果写回磁盘即可
我假设文件内容的布局如下:
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX\r\n
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX\r\n
:
:
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWX\r\n
abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxx\r\n
abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxx\r\n
:
:
abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxx\r\n
代码:
//加载
var data=File.ReadAllBytes(“File.txt”);
var itemCount=data.Length/52;
var索引=新的整数[itemCount];
对于(int i=0;i
{
对于(int i=0;i<50;i++)
{
if(data[x*52+i]>data[y*52+i])返回1;
if(data[x*52+i]
快速排序(如果使用正确)可以非常有效地对字符串进行排序
诀窍是修改分区方法。其主要思想是,在每个分区步骤中,特定分区中的键具有相同的前缀。当您再次进行分区时,您不需要将该前缀与键进行比较
例如:
假设输入是{“hello”,“world”,“house”,“homly”}
,第一个分区是围绕键“world”的
你会得到:{“你好”,“豪斯”,“霍姆利”},{“世界”}
当您想要重新划分第一个集合时,您不必比较字符串的第一个字符,因为您已经知道第一个字符在字符串中是相同的