关于大数据量的字符串如何处理?
问题:现在我有很多的字符串大概有500万个需要处理,用什么样的数据类型在时空上比较合适?具体的问题描述:有一大堆的字符串在一个txt中都是这样的格式21001221110011(每个串只有2,1,0这三种数字且都是14位)这样的数字串大概有200万个以上,现在要统计这些串中重复的数字串及其重复的次数,应该如何编程?(在时间和空间上尽量可行) --------------------编程问答-------------------- 按三进制读入为内部格式. --------------------编程问答--------------------
何为内部格式,我也是按三进制来实现的,但对内存的需求太大,时间也很长。 --------------------编程问答-------------------- System.Int32 有符号 32 位整数 -2,147,483,648 到 2,147,483,647
3^14 = 4,782,969,而14位的0,1,2组成的串可以用 0 - 4,782,968 表示,内部用 int 表示足够了。 --------------------编程问答-------------------- 那统计我应该如何来完成 --------------------编程问答--------------------
static int ReadStr(string s)--------------------编程问答-------------------- 将他们转化为十进制的数以后如何来进行统计的操作,我没有好的算法呀!! --------------------编程问答-------------------- 请问楼主"这些串中重复的数字串及其重复的次数"的含义是什么,是最大重复字串吗?还是指定字串,比如“00”有多少个? --------------------编程问答-------------------- 建议看看严慧敏的数据结构中的 “哈弗曼编码” --------------------编程问答-------------------- Mark --------------------编程问答--------------------
{
if (s.Length != 14) return -1; // 如果为了效率, 本行可以省略
int x = 0;
for (int i = s.Length - 1, d = 1; i >= 0; i--, d *= 3)
{
x += d * (int)(s[i] - '0');
}
return x;
}
每个串都是14位的数字串,这样的14位数字串有200多万个,我要统计14位串的重复次数 --------------------编程问答-------------------- 恩 --------------------编程问答-------------------- 插入 sql表里,统计 sql 表 --------------------编程问答-------------------- 还是用二进制方式效率高些,毕竟计算机是二进制的
定义合适大小的缓冲区(byte数组),内部缓冲大小一般是4K(4096)
遍历判断即可,为了提高效率,可以使用unsafe代码 --------------------编程问答-------------------- 写数据库参数的方式进行存储
@parm
获取System.Text.StringBuider --------------------编程问答-------------------- 5楼的程序可行。构造一个数据库表格,设置列"data"为索引。
然后用SQL筛选,举个例子:
select distinct Data, count(*) as num
from [数据库]
group by data
其中data是用5楼转换的数据,你看num列就是重复次数了。 --------------------编程问答--------------------
up --------------------编程问答-------------------- // 逐行读取文本,网上很多,我不写了。我写统计部分。
string[] a = File.ReadAllLines(@"1.txt"); // 200万行不能用这个,我只是举例。
Hashtable hs = new Hashtable();
foreach (string b in a)
{
if (hs.ContainsKey(b))
{
hs[b] = Convert.ToInt32(hs[b]) + 1; // 重复次数
}
else
{
hs.Add(b, 1);
}
}
IDictionaryEnumerator ide = hs.GetEnumerator();
while(ide.MoveNext())
{
int y = Convert.ToInt32(ide.Value); // 大于2就是重复的,y是重复次数。
}
补充:.NET技术 , C#