编程珠玑第一章之产生数据1000000-9999999

最近准备读一读经典书籍,选定了《编程珠玑》,翻开第一章,哦,磁盘排序,思想很简单,纸上觉来终觉浅,于是乎,动手写一写吧。

排序,那我需要有这个文件吧,于是决定产生一些随机文件来模拟,这一篇内容就是产生随机数的一些探讨。

由于作者之前一直做.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多吧。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值