编程珠玑第一章之产生数据1000000-9999999
2015-11-23 21:58
316 查看
最近准备读一读经典书籍,选定了《编程珠玑》,翻开第一章,哦,磁盘排序,思想很简单,纸上觉来终觉浅,于是乎,动手写一写吧。
排序,那我需要有这个文件吧,于是决定产生一些随机文件来模拟,这一篇内容就是产生随机数的一些探讨。
由于作者之前一直做.NET,最近决定转战C++,于是选用c++写,可是一上手遇到一个蛋疼问题,即rand()函数问题,RAND_MAX最大值是32767啊,于是决定先用C#实现,最后太讨论c++,所以下一篇是c++实现篇。
书中很明确的说要无重复数,于是,于是,于是,选用什么数据结构好呢,笔者之前略微有点经验,所谓的半吊子程序员,所以也想到了哈希表,C#里边的lookup表无外乎就是Dictionary和Hashtable之类的,但是我想验证一下用其他数据结构会怎么样,于是乎,产生下面的结果。
1.选用List<Int 32>
代码如下:
2.选用Dictionary<Int 32, Int16>
代码如下:
跑1w条数据就是一瞬间啊,所以没截图,跑8999999条的时候,结果如下:也就是跑完全部才用不到1分钟,效率真的提高千百倍啊。生成的文件70M多吧。
排序,那我需要有这个文件吧,于是决定产生一些随机文件来模拟,这一篇内容就是产生随机数的一些探讨。
由于作者之前一直做.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多吧。
相关文章推荐
- JAVA语法基础之运算符
- 【UVALive】3029.City Game<C++>
- Java服务器热部署的实现原理
- JAVA语法基础之运算符
- 三色排序问题/(荷兰国旗问题)(C++版)
- C# 扩展方法
- LoadRunner在录制脚本时会出现java异常的解决方案
- 4、Java数组
- 如何在matlab中添加工具箱addpath
- java基础入门--java的命名规则
- C++ 表达式
- java基础入门-常见的DOS命令
- 【应用笔记】【AN003】VC++环境下基于以太网的4-20mA电流采集
- 二叉树的基本操作的c++实现
- C++ for_each学习笔记
- intellij 14创建java web
- An internal error occurred during: "Periodic workspace save.". Java heap space
- Java反射机制学习笔记(一)
- java String 连接问题
- C/C++中void用法总结