摘要: 基本概念 哈希表(Hash Table)是一种根据关键字直接访问内存存储位置的数据结构。通过哈希表,数据元素的存放位置和数据元素的关键字之间建立起某种对应关系,建立这种对应关系的函数称为哈希函数(如图)。哈希函数构造方法 哈希表的构造方法是:假设要存储的数据元素个数为n,设置一个长度为m(m≥n)的连续存储单元,分别以每个数据元素的关键字为自变量,通过哈希函数,把映射为内存单元的某个地址,并将该数据元素存储在该内存单元中。 从数学的角度来看,哈希函数实际上是关键字到内存单元的映射,因此我们希望通过哈希函数通过尽量简单的运算使得通过哈希函数计算出的哈希地址尽量均匀地被映射到一系列的内存单元... 阅读全文
posted @ 2013-11-22 17:21 LukyW 阅读(10133) 评论(38) 推荐(39) 编辑
摘要: 概述 平方根倒数速算法,是用于快速计算1/Sqrt(x)的值的一种算法,在这里x需取符合IEEE 754标准格式的32位正浮点数。让我们先来看这段代码: 1 float Q_rsqrt( float number ) 2 { 3 long i; 4 float x2, y; 5 const float threehalfs = 1.5F; 6 7 x2 = number * 0.5F; 8 y = number; 9 i = * ( long * ) &y; // evil floating p... 阅读全文
posted @ 2013-10-24 21:15 LukyW 阅读(4326) 评论(5) 推荐(9) 编辑
摘要: 引言 在上一篇文章中,我介绍了动态类型以及它的用途,然后顺便提了一下关于如何使用动态类型来实现一个解决方案,但是都过于空洞,那么就让我们通过本文深入到实际的代码中去看看动态类型的实现和调用。 首先简单回顾一下什么是动态类型,因为有些读者没有阅读过本文的第一部分或者希望跳过上篇文章直接阅读本文。 所谓动态类型,就是运行时在程序内部动态生成的类或者类型。当应用程序启动后,至少会运行一个AppDomain,为了向AppDomain中添加动态类型,首先需要创建动态程序集,顾名思义,动态程序集就是在运行时创建并添加到AppDomain的程序集,它通常不会被保存到文件中,而是单独寄宿于内存中。动态程... 阅读全文
posted @ 2013-08-16 10:05 LukyW 阅读(1602) 评论(6) 推荐(3) 编辑
摘要: 引言 动态类型(Dynamic Types)可以向框架开发者提供高效的抽象编程模型,而不会产生通常因抽象而导致的性能损失。通过对面向接口编程和工厂设计模式的使用,可以开发一个框架,它既享有抽象编程模型通用的好处,同时也兼具硬编码逻辑的性能优势。 动态类型工厂使用程序基本元数据,确定以最佳的方式在运行时建立新类型。类代码被直接“发出”到内存中的程序集中,无需通过.NET语言特定的编译器编译。类一旦被“发出”,它就已经被CLR“烘烤”好并随时可供应用程序使用了。 这种方式看似只允许我们创建具有硬编码逻辑的类,但其实是非常灵活的,因为你可以发出很多类,只要让所有的类实现相同的接口即可。 通过... 阅读全文
posted @ 2013-07-15 14:39 LukyW 阅读(2441) 评论(3) 推荐(4) 编辑
摘要: 概述在.NET应用中,导出Excel是很常见的需求,在我维护的一个应用中就遇到到了这样的需求,需要每月定时从不同的Server的不同数据库中获取Excel报表,手动生成实在是非常蛋疼。导出Excel报表大致有以下三种方式:Office PIA,文件流和NPOI开源库,本文只介绍前两种方式。Office PIA.NET开发人员首选的方法,通过COM组件调用Office软件本身来实现文件的创建和读写,但是数据量较大的时候异常缓慢;如下代码所示已经做了优化,将一个二维对象数组赋值到一个单元格区域中(下面的代码中只能用于导出列数不多于26列的数据导出):public static void Expor 阅读全文
posted @ 2013-04-08 14:31 LukyW 阅读(2077) 评论(1) 推荐(0) 编辑
摘要: 概念单例(Singleton)模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。它有三个要点:该类只能有一个实例必须自行创建这个实例须向整个系统提供该实例对于以上三个要点的理解:该类只能有唯一的一个实例,该类无法通过其他方式创建除了其本身提供的实例之外的新实例,换言之,一旦该类提供的实例被创建,该实例则是唯一的,无法重复创建或者修改;该类必须自行提供该实例,即实例化该类本身;向整个系统提供该实例,很明显该单例对象须要该单例类能够为其提供一个全局访问入口C#实现该模式的后两点是非常容易理解的,而在实现该模式中的各种方法中对于单线程工作模式下的实现也非常简单。代码如下: 1 p 阅读全文
posted @ 2012-09-12 17:29 LukyW 阅读(377) 评论(0) 推荐(0) 编辑
摘要: 引言之前在一个项目中遇到了页面之间的跳转需要保留前一个页面的部分信息的问题,需要将对象转化为Base64字符串便于在页面上保存,于是决定自己实现一个。编码Base64要求把每3个8位字节转换为4个6位字节(高2位始终为0),然后依次用26个大小写字母,0-9的十个数字以及“+”和“/”一共64个字符来代替。完整的定义可以参见RFC-2045。 由于要编码的字节存在不能被3整除的情况,最后会多出1或者2个字节,这时候就需要用0来补齐,如果多出1个字节,那么则需要补2个字节,如果多出2个字 节,则需要补1个字节以用于编码,在最后编码的字符串中,补多少个字节就在最后添加多少个“=”。代码很简单了,代 阅读全文
posted @ 2012-09-12 17:18 LukyW 阅读(551) 评论(0) 推荐(0) 编辑