<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>{ Snake @ NET }</title>
	<atom:link href="http://bugunow.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://bugunow.com/blog</link>
	<description>废寝忘食的程序工作者.</description>
	<lastBuildDate>Tue, 31 Aug 2010 17:21:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>LOVE is SUPER EASY.</title>
		<link>http://bugunow.com/blog/love-is-super-easy/</link>
		<comments>http://bugunow.com/blog/love-is-super-easy/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 17:16:31 +0000</pubDate>
		<dc:creator>Snake</dc:creator>
				<category><![CDATA[Family]]></category>
		<category><![CDATA[Love]]></category>

		<guid isPermaLink="false">http://bugunow.com/blog/?p=204</guid>
		<description><![CDATA[Hello,我是Snake,欢迎阅读我的文章--LOVE is SUPER EASY. 喵好不容易在博客上更新了一篇文章. 这还是一堆图片和简简单单的几行字的随笔. 主题是关于我最后一个暑假的最后几天. 内容是我和某喵去放风筝,可笑的是我22岁才成功把风筝放飞到天上. 阳光刺眼,就像我们现在的年龄.穿透金色的风筝,把风筝照成金色. 其实某喵孩子气到完全不像她的年龄,而我却对玩乐完全不上心. 她的任性总是让我妥协,而这些小玩意的确让我们在一起的时光变得更加美好. 其实,爱超级简单,每天都能在睡前亲切地说一句"晚安",即使两人在睡觉前吵了一个多么史无前例的架. 站内任何内容未经作者声明,皆为作者原创,并采用知识共享署名2.5中国大陆许可协议进行许可. 欢迎转载,但转载者必须提供以下文字和连接: 本内容转载自{ Snake @ NET },原文地址:LOVE is SUPER EASY.(http://bugunow.com/blog/love-is-super-easy/)]]></description>
		<wfw:commentRss>http://bugunow.com/blog/love-is-super-easy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用接口与委托的常用方法来谈二者的区别</title>
		<link>http://bugunow.com/blog/difference-between-interface-n-delegate/</link>
		<comments>http://bugunow.com/blog/difference-between-interface-n-delegate/#comments</comments>
		<pubDate>Wed, 18 Aug 2010 17:58:03 +0000</pubDate>
		<dc:creator>Snake</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[delegate]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[委托]]></category>
		<category><![CDATA[接口]]></category>

		<guid isPermaLink="false">http://bugunow.com/blog/?p=191</guid>
		<description><![CDATA[Hello,我是Snake,欢迎阅读我的文章--用接口与委托的常用方法来谈二者的区别 早先的一篇文章让我与几个朋友引发了一些讨论,大部分都在谈论的表达能力的问题,于是我在这一篇重整语言,并且将二者的部分通用方法列举出来再次试图表明他们的区别.希望我这次的行文会更容易让人接受一些.废话不多说,正题开始. 1. 困惑 接口与委托之所以出现混淆,是因为二者都能影响某一个方法的执行结果或执行过程,写一个极为简单的例子就能看出他们的相似: public class DeleTest { public DeleTest(decimal a, decimal b) { this.a=a; this.b=b; } private decimal a,b; //这是一个通过传递一个Func&#60;T1,T2,TResult&#62;委托来计算值的方法. public decimal Calculate(Func&#60;decimal, decimal, decimal&#62; func) { return func(a,b); } //下面是2个匹配Func&#60;T1,T2,TResult&#62;的方法. public decimal Add(decimal a,decimal b) { return a+b; } public decimal Substract(decimal a,decimal b) { return a-b; } //我们通过以下方式调用来改变Calculate的值 public static void [...]]]></description>
		<wfw:commentRss>http://bugunow.com/blog/difference-between-interface-n-delegate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于List和LinkedList的小测试</title>
		<link>http://bugunow.com/blog/tests-of-list-and-linkedlist/</link>
		<comments>http://bugunow.com/blog/tests-of-list-and-linkedlist/#comments</comments>
		<pubDate>Sat, 07 Aug 2010 16:31:10 +0000</pubDate>
		<dc:creator>Snake</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[LinkedList]]></category>
		<category><![CDATA[List]]></category>
		<category><![CDATA[测试]]></category>

		<guid isPermaLink="false">http://bugunow.com/blog/?p=187</guid>
		<description><![CDATA[Hello,我是Snake,欢迎阅读我的文章--关于List和LinkedList的小测试 最近接触到了一个关于大集合定期轮询扫描的功能,因为大集合的遍历和判断可能会消耗比较多的时间和CPU资源,于是我准备根据.Net平台GC设计的代龄理念搞一个GenerationScaner.当然,不论它是否真的有效,这只是个计划.计划大概是这样的. 类中根据每个item的紧急情况(如某Item快要过期,我要发一条短信通知用户)分成3个集合,这3个集合会以不同的频率定期扫描集合内所有的item并且重新排列.第三代龄里总有些item因为时间的流逝(或其他原因)而进入第二代龄,再进入第一代龄.就像盛满水的三个不同高度的碗,最上面那个装满了就会将水流到下面一个,再到最后一个碗. 而在思考关于3个代龄的集合的实现类型的时候,我在List&#60;T&#62;和LinkedList&#60;T&#62;上思考了一会,主要是因为我觉得在3个集合中items并不是因各种特定的条件排序过的,所以我们在筛选第三代龄的item并且把筛选后的item放到第二代龄中去的时候就会面临着集合的乱序删除. 在数组的这种状态下,如果有10个项目,删除第1个,则后面9个项目都要向前移动1位,可能造成性能损失.而List&#60;T&#62;就是基于数组而实现的.对于链表来说,乱序删除就显得不是那么恐怖,如果有10个项目在一个链表内,删除第3个项目,则链表会讲第2个项目的Next引用指向第4个项目,而不用再移动任何项目. 我也在博客园中找了不少关于这两个集合的测试,但是关于链表的乱序删除这个强项却没有有力的测试.于是我决定自己试一试. 首先我写一个类Test包含一个List&#60;int&#62;和LinkedList&#60;int&#62;; 其次我在AppendTest方法中以一个向两者分别插入一千万条数据,这些数据是Random函数随机生成的数字. 然后我想测试一下二者纯遍历所需要的时间. 最后测试二者的乱序删除. 代码如下. class Program { public class Test { public Test(int count, int condition) { this.count = count; this.condition = condition; this.list = new List&#60;int&#62;(); this.ll = new LinkedList&#60;int&#62;(); } int condition = 0; int count = 0; List&#60;int&#62; list; LinkedList&#60;int&#62; ll; Random r = new [...]]]></description>
		<wfw:commentRss>http://bugunow.com/blog/tests-of-list-and-linkedlist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>写给会混淆委托(代理)和接口概念和用途的朋友们</title>
		<link>http://bugunow.com/blog/to-the-people-who-have-no-idea-with-delegate-and-interface/</link>
		<comments>http://bugunow.com/blog/to-the-people-who-have-no-idea-with-delegate-and-interface/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 08:49:43 +0000</pubDate>
		<dc:creator>Snake</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[委托]]></category>
		<category><![CDATA[接口]]></category>

		<guid isPermaLink="false">http://bugunow.com/blog/?p=177</guid>
		<description><![CDATA[Hello,我是Snake,欢迎阅读我的文章--写给会混淆委托(代理)和接口概念和用途的朋友们 昨天在和一位朋友讨论到委托与接口的问题,一开始我觉得很不可思议,这两个东西的概念怎么会混淆呢?要混淆也是接口和抽象类,委托和事件相混淆啊!但是着我的一个例子我马上意识到很有可能因为我将要表现的这个例子,让很多朋友混淆了委托与接口的用途.所以我想通过这篇文章试图说明白委托和接口的概念和用途,其实他们俩的差别还是很大的. 本文适合对委托和接口概念或用途不了解的朋友. 本文适合对委托和接口概念非常了解的朋友,并且欢迎各位朋友与Snake一起探讨有关这方面的知识. 本文不适合对委托和接口概念或用途了解一知半解(模糊)的朋友,这篇文章可能会对您产生误导,请千万别看. (本文原文是一篇没有好好排版过的email,我这里将会部分摘抄,部分改进,如果有什么地方您觉得莫名其妙,我将非常感谢您的指正!) 在文章正式开始之前我需要将MSDN上对委托和接口的内容放上来,作为文章之基. 委托: 委托是一种定义方法签名的类型。当实例化委托时，您可以将其实例与任何具有兼容签名的方法相关联。您可以通过委托实例调用方法。 委托用于将方法作为参数传递给其他方法。事件处理程序就是通过委托调用的方法。您可以创建一个自定义方法，当发生特定事件时某个类（例如 Windows 控件）就可以调用您的方法. 委托具有以下特点： 委托类似于 C++ 函数指针，但它们是类型安全的。 委托允许将方法作为参数进行传递。 委托可用于定义回调方法。 委托可以链接在一起；例如，可以对一个事件调用多个方法。 方法不必与委托签名完全匹配。有关更多信息，请参见在委托中使用变体（C# 和 Visual Basic）。 C# 2.0 版引入了匿名方法的概念，此类方法允许将代码块作为参数传递，以代替单独定义的方法。C# 3.0 引入了 Lambda 表达式，利用它们可以更简练地编写内联代码块。匿名方法和 Lambda 表达式（在某些上下文中）都可编译为委托类型。这些功能统称为匿名函数。有关 Lambda 表达式的更多信息，请参见Anonymous Functions (C# Programming Guide)。 接口: 接口描述的是可属于任何类或结构的一组相关功能。接口可由方法、属性、事件、索引器或这四种成员类型的任意组合构成。接口不能包含字段。接口成员一定是公共的。 当类或结构继承接口时，意味着该类或结构为该接口定义的所有成员提供实现。接口本身不提供类或结构能够以继承基类功能的方式继承的任何功能。但是，如果基类实现接口，派生类将继承该实现。 类和结构可以按照类继承基类或结构的类似方式继承接口，但有两个例外： 类或结构可继承多个接口。 类或结构继承接口时，仅继承方法名称和签名，因为接口本身不包含实现。 接口具有下列属性： 接口类似于抽象基类：继承接口的任何非抽象类型都必须实现接口的所有成员。 不能直接实例化接口。 接口可以包含事件、索引器、方法和属性。 接口不包含方法的实现。 类和结构可从多个接口继承。 接口自身可从多个接口继承。 正文开始 在写这些文字的时候我又将以上的各个概念熟悉了一遍,以防自己把自己忽悠混淆了.所以不适合群众请尽快退散.另外如果您看完上面的定义和特征后就从两者的混淆中走了出来,您也可以尝试继续往下看. 首先,关于委托的用法,我们可以这样使用: public [...]]]></description>
		<wfw:commentRss>http://bugunow.com/blog/to-the-people-who-have-no-idea-with-delegate-and-interface/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[记录]乱数假文生成器的制作过程</title>
		<link>http://bugunow.com/blog/new-product-lorem-ipsum/</link>
		<comments>http://bugunow.com/blog/new-product-lorem-ipsum/#comments</comments>
		<pubDate>Sat, 15 May 2010 18:14:35 +0000</pubDate>
		<dc:creator>Snake</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[假文]]></category>
		<category><![CDATA[成果]]></category>

		<guid isPermaLink="false">http://bugunow.com/blog/?p=166</guid>
		<description><![CDATA[Hello,我是Snake,欢迎阅读我的文章--[记录]乱数假文生成器的制作过程 我的乱数假文生成器已经正式发布了访问地址为:http://bugunow.com/lipsum 起因... 前两天在为系的网站设计样式稿,当我觉得页面太空了想要塞点文字的时候,花了不少时间找素材.这时候我想到当初我在一位台胞的博客上看到一篇有关假文的生成工具(具体我已经不记得网址了),于是我翻山越岭的找啊,找到了没有中文的LoremIpsum和只有繁体中文的乱数假文生成器.或许我不知道它在大陆还有什么别的叫法,于是激情一燃就不可收拾,完全忘了Google Translate就是最好的假文生成利器... 什么是乱数假文生成器? 如果非要给它下一个定义的话,乱数假文生成器就是一个:能生成一定长度的没有意义,但乍一眼望去又像极了自然文字的工具. 具体内容点这里查看. 开始动手. 在没有分析任何中英文差别下,我开始了编码工作,也因为时间的关系我并没有在如何实现这些功能的性能上考虑太多. 因为上面的原因给我这个网站埋下了2个伏笔,特别是性能上.这些稍候再说. 考虑1:在生成之前,这些"汉字"从哪里来? 个人觉得这些汉字应该要存在某个"汉字库"里面,从汉字库里随机抽取汉字堆叠生成一段假文.于是我决定做一个"字库",存放一个数量级的没有重复的汉字.那么在做生成器之前还要做一个字库存储器.突然觉得别看是一个小东西,但是真正实现起来还着实麻烦呢! 注意:我在这里其实犯了一个错,并且现在才恍然大悟.那么我将会在揭示伏笔的时候一起道出这个让我南辕北辙并且现在还没有实现的功能吧. 编写字库这个程序的时候是我最花时间的时候,因为自己都在做web开发,很少做winform开发,所以一开始搞winform的时候就拉了好多有的没的的控件,为了它的美观花了不少功夫.其次,在编写代码的时候我非常注意OO,并且尽量让每个Method中的代码不超过10行,做了好多防止误操作的检测,还大玩特玩起了事件机制.所以结果由此而知,我竟然做出了一个"产品"出来,而不是只做一个自己临时用一用的小工具而已. 动手1:实现字库的思路如下: 1.首先写了一个匹配英文字母和空格的正则表达式,写了一个平常经常使用的标点符号数组. 2.因为我只想让字库拥有"汉字"这唯一的属性,所以就定义了一个List&#60;char&#62;作为字库来所有的"汉字" 3.从外部txt文件中读取文档作为Source. 4.去除Source中所有的"非法"字符,空白,和英文单词. 5.循环Source中的每一个"汉字"并且查看字库中是否已经含有这个汉字,如果字库中没有这个汉字的话,则添入,否则继续循环. 6.循环结束并且序列化成二进制文档保存以备后需. 就这6跳步骤,我1个小时完全就能做出来了,出了思考的时间之外,就是上面说过的,太追求"完美"了.. 动手2:导入字库. 上网下载了一个长达6MB多的txt小说扔进"工厂"里加工之后字库的汉字数量由0变成了3500多不由得意了一下.不过,耗时1分多钟.... 此时进入生成器编码阶段,我流利地新建了一个工程(类库),决定要把它做到足够通用. 思考2:生成器的流程: 1.构造一个Lorem Ipsum类,给出汉字字库和英文词库的path,再给出换行符符号(因为在web换行是&#60;br/&#62;而在win下,换行符是\n). 2.执行制造假文Method,并传进一个LoremIpsumModel参数(实体类)里面包含了各种生成选项. 3.根据参数计算出假文应该有多少段落,并且每段多少个字. 4.开始随机取汉字堆假文.并且在段落的最后加入"结束标点符号"和换行符. 5.根据参数插入零星英文单词和标点符号. 6.返回假文. 由上面的流程可以看出将要做出以下几个东西: 1.中英文标点常量,并且还要区分结束和非结束标点. 2.英文字库(真悲剧现在才想到). 3.假文分段的算法,计算英文单词个数的算法,标点符号个数的算法(包括在方圆几个汉字之内不能重复出现标点). 悲剧,因为考虑到英文单词更能表现一个字体的全能性(中英文都好看),于是停下了手中写生成器的工作,开始写英文词库. 英文词库处理工具比汉字字库要来的方便的多,一个正则就能揪出所有的英文单词,为了效率,这个工具写的很脆弱,花了半小时,之后立马删除了. 最后制作生成器除了考虑通用性之外,很迅速的就写出了具体的生成方法,在winform和web上都能通用让我快乐,终于也跨"平台"了一次!呵呵.. 动手3:测试假文生成器. 几次debug搞定死循环错误之后,第一次测试非常的不理想.虽然的确如我所愿生成了一篇假文,500个字,3个自然段,标点正常.结果一大堆乱七八糟的字,通篇下来看不到一个"你"或者"我"字.并且那些字的笔画也太多了吧,即便是天书也不能这么天书,太不真实了. 此时才开始思考中英文差别的问题,英文是拼音文字,n个字母才组成一个单词,并且由空格分开,虽然占的空间多,但是比较优美,通篇胡乱的英文乍一看上去还是非常真实的(也可能因为本人英文阅读水平太差,门外汉看不出行内的好坏),因为都是以单词的形式呈现出来的. 简体中文在使用时笔画繁多的汉字不多,并且有时候一个汉字包含了许多意思,并且不常用到.那本小说大概神神鬼鬼的内容写了太多,字虽然有3500多个,但是总体来说效果不好.我想,我们最最常用的汉字有多少个呢?1000多左右吧,多余的2500多个应该算是使用频率不是那么频繁或者根本就不频繁的汉字.于是我决定删掉汉字字库,再导一个. 这次目标盯上了鲁迅和朱自清两位老先生的作品,但是实践结果是:不够白话文一些,还是不理想!最后决定在博客上下手,自己的博文,老徐的,老赵的,老七老八的文章复制了大概26k左右,导入了1200多个字.这才有了不错的效果! 伏笔之一:没有分析中英文差距和中文特色导致花费很多时间在调整字库上,到此终于解决. 伏笔二:性能.做了一次非常非常简陋的测试,循环10000次生成1000字的假文花了7秒多..还是比较久的,并且CPU占用率超过70%.还好这个工具不是特别多人用,而且我的工具目前访问人数不是特别多,也就先不担心了. 最后花了点时间微调标点符号和段落的算法,开始搞网站了.网站因为功能单一没啥好说的,只是花了不少时间在设计上面.现在也在上传到主机的途中. 说说缺点: 1.没有根据汉字的使用率频繁与否生成一段更真实的假文. 之前还在想要不要做一个Key Value  Pair,key里放的字汉字,Value放的是频率,对比重复一次自加1,然后根据一定算法获取常用字.这是时间换空间的做法.但个人认为根本没这必要(写这篇文章的时候才想到的).首先字库再怎么大也超不过10M,10M的txt文本至少也有上千万个字吧,这种业务,字库放个50000字就算小题大做了,那么生成的字库文件也不过50多k吧.另外,获取数组的index位的时间复杂度是O(1),不会因为字库的文字多而导致性能问题.一个字库重复的字多了,被选中的几率就搞了,代码写起来也简单了,内存和硬盘空间的占用也完全不是问题.那么我何必还大费周章去搞汉字字库处理工具呢?Orz.... update [...]]]></description>
		<wfw:commentRss>http://bugunow.com/blog/new-product-lorem-ipsum/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Winform跨线程操作控件的办法.</title>
		<link>http://bugunow.com/blog/controls-cross-thread-calling/</link>
		<comments>http://bugunow.com/blog/controls-cross-thread-calling/#comments</comments>
		<pubDate>Thu, 13 May 2010 09:49:01 +0000</pubDate>
		<dc:creator>Snake</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[多线程]]></category>

		<guid isPermaLink="false">http://bugunow.com/blog/?p=161</guid>
		<description><![CDATA[Hello,我是Snake,欢迎阅读我的文章--Winform跨线程操作控件的办法. 今天写了个程序,碰到了这个问题: 线程间操作无效: 从不是创建控件 [控件名称]  的线程访问它。 我现在正在使用vs2010英文版,平常也很少看那些有的没的文字,而且在写程序的时候很"明智"的异常捕获并且写进日志里去,所以没有出现那个可爱的调试状态下出现异常的那个小框框. 我在上网查了一会儿,有人说直接设置控件的CheckForIllegalCrossThreadCalls属性为false,但是因为可能的不安全因素所以还是不用的好.当然还有写一个委托来同步调用.但是我觉得它有点麻烦,就放弃用委托同步了. 后来我搞了好多种写法,都摆脱不了这个怨念,最终也摆脱了异常捕获并抛出了这个小框框. 框框上明确的说道:"线程间操作无效: 从不是创建控件 [控件名称]  的线程访问它。"但是在框框的Suggestion列表中显示出了一条项目,大意是:"如何：对 Windows 窗体控件进行线程安全调用.",我点开它,并且跳进了MSDN. 原来在MSDN上就有教咱如果夸线程操作控件啊.亏我还Google半天呢. MSDN上的办法就是使用委托来同步调用控件的.具体方法我也就不卖关子了.因为MSDN上的代码比较繁多,所以我稍微改进了一下. //首先声明一个委托. delegate void SetValueDelegate(int val); //模仿程序中的跨线程调用 public void Progress() { Thread t = new Thread(() =&#62; { //跨线程由此开始 SetValue(100); }); t.Start(); } //关键部分在这里 public void SetValue(int val) { //InvokeRequired属性当非创建本控件线程操作的时候 //它返回true,此时使用窗体(该控件的创建者)的Invoke方法创建同步调用. //妙哉,妙哉! if (ProgressBar1.InvokeRequired) { var svd = new [...]]]></description>
		<wfw:commentRss>http://bugunow.com/blog/controls-cross-thread-calling/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>编程基本功之算法(1)&#8211;快速排序与冒泡排序</title>
		<link>http://bugunow.com/blog/algorithms-quick-sort-n-bubble-sort/</link>
		<comments>http://bugunow.com/blog/algorithms-quick-sort-n-bubble-sort/#comments</comments>
		<pubDate>Thu, 06 May 2010 08:03:47 +0000</pubDate>
		<dc:creator>Snake</dc:creator>
				<category><![CDATA[Others]]></category>
		<category><![CDATA[冒泡排序]]></category>
		<category><![CDATA[快速排序]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://bugunow.com/blog/?p=150</guid>
		<description><![CDATA[Hello,我是Snake,欢迎阅读我的文章--编程基本功之算法(1)&#8211;快速排序与冒泡排序 作为计算机应用专业的学生,个人觉得这个专业在未来是绝对要饿死的.所以如果对计算机研究不深,咱们还是老老实实回家卖香鸡排(注1)都比搞IT赚钱. 自学了1年10个月的ASP.NET平台和C#语言的开发,期间被魔兽世界和各种公务打断了半年多,学了个大概懂得不少架构方面和程序设计方面上的知识.自己也可以算是个超越了"新手上路"级别的程序员了.可是当有一天博客园的大牛之一老赵(注2)在招聘北大青鸟(注:专业IT技能培训学校)毕业的学生时要求他们写一个数组反转的代码,结果令他很失望.老赵一失望,我就快绝望了. 立马要离校实习的我目前虽然看法和这些北大青鸟毕业的学生不一样,但是自己同他们还是有很大的相似之处--能盖空中楼阁.光有花拳绣腿,真正那些底子是一点也没有.最终悲剧的还不是自己.要有浓厚的底蕴你才会洋溢出耐人寻味的芳香.花拳绣腿在专业人士看来就像村姑抹法国香水一样可笑. 所以在老赵的"开化"之下,我开始认真的研究起计算机科学这一门学科与计算机编程有关的科目.其中就包括--算法.(当然还有好多与本次笔记无关的东西) 当然在学习算法之前得熟悉一下基本的数据结构.好在上个学期老师已经教过我们,并且前些日子我也认真的复习了一遍.不过由于它太过简单.个人认为就没必要写一份关于数据结构的笔记了. 关于算法的基本常识,包括时间复杂度,空间复杂度那些我就不罗嗦了,直接上链接. 记得大一学C语言的时候老师教我们用循环控制语法的时候有一个题目就是关于排序的.题目如下:给定一个数组,根据对比数组的某两个元素的大小,有序的重新排列数组. 答案也很简单.就是两个for循环遍历整个数组,对比当前所选的两个元素的大小让他们交换位置.最终完成排序.后来老师告诉我们这叫冒泡排序.这个排序算法的名字很形象.最小的那个数字回像冒泡泡一样从某一个位置慢慢得浮上来. main() { int a[] = {5,6,2,3,1,9,7,4,8}; int l=9; int i=0,j=0; int temp; for(;i&#60;l;i++) { for(;j&#60;l;j++) { if(a[i]&#62;a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } for(i=0;i&#60;l;i++) { printf(&#34;%d &#34;,a[i]); } getch(); } 以上为C语言的实现方法.核心代码不多,也就那么11行.但是明显可以看出它的不高效. 上面的2个for表明这个代码要运行"l"的平方次,也就是81次.而且是必须执行81次. 程序就是程序,人可以通过眼睛的观察然后判断,最终的对边的移动最多也不过20次. 那么有什么办法让数字的遍历次数变少呢?一个1962年提出的古老的排序算法(其实一点都不古老,好多现用的算法都是已经诞生了几十年并且历经时间的磨砺)但依旧是世界上最快的算法,它的名字果真名副其实--QuickSort(快速排序),让我有必要与它会一会面. 快速算法是基于分治算法的理论而设计出来的一种排序方法.基本思想是这样的. (1)在将要排序的数组arr中随便一个位置抽取一个元素作为对比项key. (2)定义2个变量low,high分别为数组的最低下标和最高下标. (3)对比key与最高下标的值hiVal.如果hiVal小于key,那么hiVal与key调换位置,否则high-1 (4)对比key与高低下标的值loVal.如果loVal大于key,那么loVal与key调换位置,否则low+1 (5)重复(3)(4)2步,直到所有比key小的元素都在key的左边,比key打的元素都在key的右边.此时整个数组以key为基准分为了2组暂且名为lPart和rPart. (6)这时再递归(1)~(5)的操作,当然此次递归的数组不是原来我们执行操作的数组arr,而是分组之后lPart和rPart. 由上面的的步骤看来快速排序会将原本的一个数组分割成为2个,2个变为4个,4个变为8个,直到排序完毕. 那么快速算法的时间复杂度是什么呢?教科书上写着: 最糟糕的情况下它与冒泡排序是一样的时间复杂度O(n的平方) 最良好好的情况下它的时间复杂度是O(nlogn) [...]]]></description>
		<wfw:commentRss>http://bugunow.com/blog/algorithms-quick-sort-n-bubble-sort/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>没有了Linq和扩展方法,一切都靠自己&#8211;手写Sort和Search方法.</title>
		<link>http://bugunow.com/blog/write-the-sort-n-search-method-by-myself/</link>
		<comments>http://bugunow.com/blog/write-the-sort-n-search-method-by-myself/#comments</comments>
		<pubDate>Thu, 29 Apr 2010 03:48:29 +0000</pubDate>
		<dc:creator>Snake</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[排序]]></category>
		<category><![CDATA[搜索]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://bugunow.com/blog/?p=147</guid>
		<description><![CDATA[Hello,我是Snake,欢迎阅读我的文章--没有了Linq和扩展方法,一切都靠自己&#8211;手写Sort和Search方法. 众所周知在ASP.NET3.5中对于实现了IEnumerable&#60;T&#62;接口的类相比于ASP.NET2.0多出了好多方法出来,他们大部分都是基于Linq.在Linq的帮助下我们可以用1行代码就完成Sort和Search方法. 当然在ASP.NET 2.0 中 Array类中有一个静态Sort方法,还是List中也有一个Sort方法.但是他们分别都是独立并且接收的参数过于"小众",面对Linq关于IEnumerable接口实现的那些强大的Sort方法来说真是小巫见大巫啊.不但少了Func&#60;T,TResult&#62;委托,还少了Lambda表达式..昨晚搞一个实体类集合的排序就被郁闷到了.今早起床立即写了两个会用到的方法,当然相对于Linq来说还是比较小众,这是水平问题和语言本身的限制性. 他们分别是泛型类,并且都是静态方法,接收一个实现了ICompareable&#60;T&#62;接口的类型T.另外所用到的Sort方法来自最简单的QuickSort,而Search方法来自于限制比较大的BinarySearch(需要已经排序好的数组)和最最普通的遍历查找.最后他们都接收一个实现与IList&#60;T&#62;接口的类型作为排序或查找对象(已知Array和List都实现了这2个接口). 下面放上代码: public class Sort&#60;T&#62; where T : IComparable&#60;T&#62; { public static IList&#60;T&#62; QuickSort(IList&#60;T&#62; list, bool desc) { int lo = 0; int hi = list.Count - 1; int tag; if (lo &#60; hi) { tag = QuickSortPartion(list, lo, hi, desc); QuickSort(list, lo, tag - 1, desc); QuickSort(list, tag [...]]]></description>
		<wfw:commentRss>http://bugunow.com/blog/write-the-sort-n-search-method-by-myself/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>老赵演讲:Why Java Sucks &amp; C# Rocks 录音清晰版.</title>
		<link>http://bugunow.com/blog/audio-record-of-jeffz-why-java-sucks-n-csharp-rocks-speech/</link>
		<comments>http://bugunow.com/blog/audio-record-of-jeffz-why-java-sucks-n-csharp-rocks-speech/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 03:24:30 +0000</pubDate>
		<dc:creator>Snake</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[演讲录音]]></category>
		<category><![CDATA[老赵]]></category>

		<guid isPermaLink="false">http://bugunow.com/blog/?p=129</guid>
		<description><![CDATA[Hello,我是Snake,欢迎阅读我的文章--老赵演讲:Why Java Sucks &#038; C# Rocks 录音清晰版. 我个人是非常崇拜老赵的,可惜人不在上海无法现场光临他的关于这次语言层面上的演讲. 虽然这次演讲引起了部分Java程序员的反感,但是的确,从它讲这两种语言的发展史就能很清晰地感觉到C#语言的轻便性. 这次演讲的录音是他的朋友韦恩卑鄙提供的(话说我的英文名也是Wayne.呵呵). 我把它用牛顿3放大了下声音,并压缩一下波形,让老赵的声音更清晰平稳,这样听就不费劲,也不怕声音忽大忽小了. 边听录音边看PPT,效果灰常好..哈哈! 下载地址 站内任何内容未经作者声明,皆为作者原创,并采用知识共享署名2.5中国大陆许可协议进行许可. 欢迎转载,但转载者必须提供以下文字和连接: 本内容转载自{ Snake @ NET },原文地址:老赵演讲:Why Java Sucks &#038; C# Rocks 录音清晰版.(http://bugunow.com/blog/audio-record-of-jeffz-why-java-sucks-n-csharp-rocks-speech/)]]></description>
		<wfw:commentRss>http://bugunow.com/blog/audio-record-of-jeffz-why-java-sucks-n-csharp-rocks-speech/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>数据结构复习:用自己的方式实现List</title>
		<link>http://bugunow.com/blog/write-a-new-list-t/</link>
		<comments>http://bugunow.com/blog/write-a-new-list-t/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 14:35:57 +0000</pubDate>
		<dc:creator>Snake</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[数据结构]]></category>

		<guid isPermaLink="false">http://bugunow.com/blog/?p=122</guid>
		<description><![CDATA[Hello,我是Snake,欢迎阅读我的文章--数据结构复习:用自己的方式实现List 最近复习起数据结构,真是后悔原来上课不好好听课.可以说当学校开设数据结构这门课程的时候虽然我知道他重要,但是我一直都在睡觉,而现在重新拿起这本书,我要好好把它看完,而这不叫复习了,叫做学习. 在书的第二章开始介绍数据结构的时候就提到了线性表,线性表理所当然的成为了数据结构中最简单的结构,而基础的线性表有2种,其一是顺序表,其二是链表.因为顺序表实在是太简单,简单到我们平常天天碰到的数组就是一个最典型的顺序表,而C#又提供了一组完美的数组操作方法,这样看来实现顺序表实在是没有什么挑战性(定义一个数组,搞2个方法就完事了).而链表不同, 链表是有N个包裹着实际数据的特殊类型的集合,而这些类型在内存中实际上又没什么联系,他们的关系在于这个特殊类的一个属性(Next)引用了下一个类型,以此类推,1的Next引用2,2的Next引用3..最终形成一个关系链,"链表"这个名字也由此而来. 废话不多说,我们就来实现一个泛型List, we call it MyList&#60;T&#62; 首先我们建立一个新的类,叫做MyList.cs,并且再建立一个上面所说的"特殊的类"代码如下: namespace proj_0329 { /// &#60;summary&#62; /// Write a new Generic List called MyList. /// &#60;/summary&#62; public class MyList&#60;T&#62;:IEnumerable&#60;T&#62;,IEnumerator&#60;T&#62; { //这就是上面所说的特殊类型,是个嵌套类,它没必要被其他任何类型访问到 class MyListNode&#60;t&#62; { public MyListNode(t val, MyListNode&#60;t&#62; next) { this.val = val; this.next = next; } private t val; private MyListNode&#60;t&#62; next; public t Value [...]]]></description>
		<wfw:commentRss>http://bugunow.com/blog/write-a-new-list-t/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
