Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对大量长度相同的字符串进行排序_C#_Algorithm_Sorting - Fatal编程技术网

C# 对大量长度相同的字符串进行排序

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的字符串,那么

我有一个非常大的字符串序列。每根绳子的长度是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的字符串,那么这可能不会削减它。

如果我必须编码,我可能会根据前几个字符左右,将输入拆分为多个输出文件;其目标是使每个输出文件足够小,以适应主内存。然后我将按顺序打开每个文件,在内存中对其排序,并将其附加到输出中。第一个过程是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”的

你会得到:
{“你好”,“豪斯”,“霍姆利”},{“世界”}

当您想要重新划分第一个集合时,您不必比较字符串的第一个字符,因为您已经知道第一个字符在字符串中是相同的