最近准备读一读经典书籍,选定了《编程珠玑》,翻开第一章,哦,磁盘排序,思想很简单,纸上觉来终觉浅,于是乎,动手写一写吧。
排序,那我需要有这个文件吧,于是决定产生一些随机文件来模拟,这一篇内容就是产生随机数的一些探讨。
由于作者之前一直做.NET,最近决定转战C++,于是选用c++写,可是一上手遇到一个蛋疼问题,即rand()函数问题,RAND_MAX最大值是32767啊,于是决定先用C#实现,最后太讨论c++,所以下一篇是c++实现篇。
书中很明确的说要无重复数,于是,于是,于是,选用什么数据结构好呢,笔者之前略微有点经验,所谓的半吊子程序员,所以也想到了哈希表,C#里边的lookup表无外乎就是Dictionary和Hashtable之类的,但是我想验证一下用其他数据结构会怎么样,于是乎,产生下面的结果。
1.选用List<Int 32>
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace CreateFile1
{
class Program
{
static void Main(string[] args)
{
DateTime beforDT = System.DateTime.Now;
bool flag = false;
List<Int32> storage = new List<Int32>();
Random rand = new Random();
while (storage.Count< 10000)
{
Int32 random = rand.Next(1000000, 9999999);
foreach (Int32 temp in storage)
if (temp == random)
flag = true;
if (flag == false)
{
storage.Add(random);
}
flag = false;
}
DateTime middleDT = System.DateTime.Now;
TimeSpan ts = middleDT.Subtract(beforDT);
Console.WriteLine("创建容器花费{0}min.", ts.TotalMinutes);
WriteFile(@"F:\Pearls\C1\PhoneNumber.txt", storage);
Console.WriteLine("文件创建完成");
DateTime afterDT = System.DateTime.Now;
TimeSpan ts1 = afterDT.Subtract(beforDT);
Console.WriteLine("总共花费{0}min.", ts1.TotalMinutes);
Console.ReadKey();
}
public static void WriteFile(string filename, List<Int32> storage)
{
if (File.Exists(filename))
File.Delete(filename);
using (FileStream fs = File.Create(filename))
{
foreach (Int32 temp in storage)
{
string a =Convert.ToString(temp);
a += "\r\n";
byte[] info = new UTF8Encoding(true).GetBytes(a);
fs.Write(info, 0, info.Length);
}
}
}
}
}
结果如下:也就是花费将近1分钟时间,产生1w条数据,实在没耐心跑太多了,太慢了,因为一直在进行比较,每一次都需要遍历整个容器,所以越到后边越慢。
2.选用Dictionary<Int 32, Int16>
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace CreateFile1
{
class Program
{
static void Main(string[] args)
{
DateTime beforDT = System.DateTime.Now;
//bool flag = false;
Dictionary<Int32, Int16> dict = new Dictionary<int, short>();
Random rand = new Random();
while (dict.Count< 8999999)
{
Int32 random = rand.Next(1000000, 9999999);
if (!dict.Keys.Contains(random))
{
dict.Add(random,1);
//Console.WriteLine(dict.Count);
}
}
DateTime middleDT = System.DateTime.Now;
TimeSpan ts = middleDT.Subtract(beforDT);
Console.WriteLine("创建容器花费{0}min.", ts.TotalMinutes);
WriteFile(@"F:\Pearls\C1\PhoneNumber1.txt", dict);
Console.WriteLine("文件创建完成");
DateTime afterDT = System.DateTime.Now;
TimeSpan ts1 = afterDT.Subtract(beforDT);
Console.WriteLine("总共花费{0}min.", ts1.TotalMinutes);
Console.ReadKey();
}
public static void WriteFile(string filename, Dictionary<Int32,Int16> dict)
{
if (File.Exists(filename))
File.Delete(filename);
using (FileStream fs = File.Create(filename))
{
foreach (Int32 key in dict.Keys)
{
string a =Convert.ToString(key);
a += "\r\n";
byte[] info = new UTF8Encoding(true).GetBytes(a);
fs.Write(info, 0, info.Length);
}
}
}
}
}
跑1w条数据就是一瞬间啊,所以没截图,跑8999999条的时候,结果如下:也就是跑完全部才用不到1分钟,效率真的提高千百倍啊。生成的文件70M多吧。