随笔分类 - C/C++
摘要:二叉搜索树的基本实现。 1 /* 2 Date: 2014-04-29 3 purpose: An implementation of MAP using binary search tree. 4 */ 5 6 #ifndef CUSTOMIZED_MAP_H 7 #define CUST...
阅读全文
摘要:一迷宫算法可以直接转化为加法运算。四方格迷宫就是4进制数字从0到3333.3333 + 1 = 1 0000 = 4^4八方格迷宫就是八进制数字从0到7777 7777.而 7777 7777 + 1 = 1 0000 0000 = 8^8这么来说,一个加法器就可以解决迷宫了。二 1 maze 2 ...
阅读全文
摘要:在此之前,我已尝试过两次基数排序的方法:LSD、MSD。 我的主要改进点在于每次“申请”大块存储器,而不是采用最原始的链表。 当然这种形式本质上还是链表,只是每个节点就是一个页面。 在存储器申请/释放上,开始时一次申请/结束时一次释放,避免了一次一数字时的malloc/free调用的代价。但是,缺点还是存在的,主要在于不够缓存友好。 看一下结果就很容易明白缓存友好的重要性了。主要数据结构:const __int32 TFSI = 1024*1024*500;const int PAGEAMOUNT = 4096;const int PAGEGRANULAR = PAGEAMOUNT/sizeo
阅读全文
摘要:一、这个已经有几年时间了,刚开始学习charlie的《windows程序设计》的时候做的。现在看来,代码很乱,虽然后来还整理过几次,现在这方面没什么兴趣了,有兴趣的可自由下载。二、绘制二叉树的伪代码int drawBinaryTree(BinaryTree bt){ Queue main; Queue slave; mian.enQueue(head node of bt); while (!empty(main)){ slave.clear(); for each node in main{ drawNode(node...
阅读全文
摘要:一、这次是在上一次尝试基础上进行的,预期是达到上次性能的9倍。MSD的基本手法就是不断切片。每一步都是把整体数据切割成256片,如上图所示,实际情况切片未必均匀,有的slice内可能一个元素也没有。接下来对于每个切片怎么办呢?答案是继续切,对于特殊数据来讲,切片过程可以很快结束,这样就可以实现比LSD更快的速度。这里面最困难的地方就是如何存储每个slice的头和尾。如果采用下述方式,应该是行不通的。这个方式需要做数组元素插入,还要跟踪中间数据,因此没具体考虑。我真正采用的是下表:表中第一项表示第一个元素开启一个类别,紧跟的0表示此元素和上面的1是同一类。至于2表明在切片过程中是一个孤立的元素,
阅读全文
摘要:为了完成二维数据快速分类,最先使用的是hash分类。前几天我突然想,既然基数排序的时间复杂度也不高,而且可能比hash分类更稳定,所以不妨试一下。在实现上我依次实现:1、一维数组基数排序基本解决主要问题,涵盖排序,包含改进的存储分配策略。如果用链表来实现,大量的函数调用将耗费太多时间。2、二维数组基数排序主要是实现和原有程序的集成。一、数据结构下面是存储节点的主数据结构。typedef struct tagPageList{ int * PagePtr; struct tagPageList * next;}PageList;typedef struct tagBucket{ ...
阅读全文
摘要:一、说明。所谓决策表,类似于关系数据库的二位数据表,形如:43 01 0 181 01 2 01 2 173 174 0排序后输出:1 0 11 2 01 2 14 3 07 3 17 4 08 1 0二、问题由来。决策表约简是粗糙集的一个经典问题。关于如何解释粗糙集约简问题,我有一个很简单的解释,不过不会在这里写出。简而言之约简就是在保持原有数据集分类能力的前提下删除冗余属性。粗糙集的创始者Pawlak有着一个近乎偏执的理念:知识就是分类。完成分类是进一步完成粗糙集约简的基础。所以针对如何分类就有了各种各样的解法。蛮力算法就是两两比较,完成分类,这个复杂度很高。在这种情况下,先排序再分类是一
阅读全文
摘要:2013.06.15-2013.06.17一不小心摔了下,呆在寝室,索性读读书吧。下午粗略翻下量化研究方法,我手上的是鸡公社第五版影印,距离第一版出版的1990年已有21年。个人认为这本书的第三版、第五版最好:第一版年代久远没看过;第二版我对比过目录其中内容都融入了第三版;第四版的不好的地方在于CD的引入,对于买纸版书的人来说CD是不可容忍的,个人就不喜欢这一版;第五版改正了CD这个问题的同时,内容大幅更新。第一章和前几版一样,一个概述。第三版作者饶有兴味地谈论了芯片定价过程以及芯片公司研发比例问题。第二章直接转入存储器层次结构。存储器层次结构最初由冯.诺伊曼、Wilks以及Goldstine
阅读全文
摘要:目标:将一单线程Console程序改为MFC多线程。而且线程间无需通讯。现状:1、Windows线程栈,每线程都有自己的独立栈。进程创立时会创建一主线程。每线程栈存储默认1MB。2、Windows为抢先式多任务操作系统。级别高的线程会先运行。3、malloc序列化存储申请请求。Applications can safely use the memory management features of the C run-time library ( malloc, free, and so on) and C++ ( new, delete, and so on).4、MFC书看过一些,但没操作
阅读全文
摘要:#0 为什么称作玩具程序?1、实现简单,也就是效率一般。2、只具备无符号数的加、乘运算功能。#1 如何实现以1792为例,用数组0号元素存储2,1号元素存储9,依此类推...下面是大整数的存储结构图。存储结构定义:1#defineMAXDIGITS6423typedefstruct{4intlastdigit;5chardigits[MAXDIGITS];6}bigNum;加法实现:按位相加,再加上进位carry。两个数长度未必相同,所以高位的处理需要特别对待。乘法实现:乘法其实是用加法来实现的,下面列出了伪码实现。1intmultiplyBigNum(bigNum*src,bigNum*ds
阅读全文
摘要:#1 每行数据代表一个集合,如何判断集合的包含关系? -- 集合的数据仅在有限范围内。0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 a --24个元素1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 b --24个元素最容易想到的是蛮力运算,计算前还应该知道谁元素多,对吧?不过还好,我耍了个花招,在读取数据时已经把数组元素数目存入数组第0号元素。1foreachelementxina2if(!setContain(b,x))3returnfa
阅读全文
摘要:#1 什么是溢出当前计算机采用2补码方式编码数字,以8位为例,表达的全部数值范围为 -128 -- 127。正数符号位为0,负数符号位为1。1000 0000表示 -128,快速计算方式是将其当作无符号数 128,然后减去 2^8, 全部过程为 128 - 256 = -128。或者反码后加一,同样为 1000 0000 ,即128,当然是 -128。溢出也就是数值逾越了当前数值表表达范围。例如 138 不在 -128 -- 127范围内。#2 加法运算中的简单补救措施例如 120 + 121,120和121都是正常范围内可以表达的数字,但其和 241 属于溢出。再如 -120 -121,结果
阅读全文
摘要:#0 本程序递归生成树,树在分叉时可能二叉,也可能三叉...,但不超过16叉,所以果断用了数组。最终完成大概600行,最初估计大半天完成,最终花了三天。最大感受:一旦数据定型,程序基本结构也定型了 | 自顶向下,化解复杂度控制很有效.#1 数据类型应用 typedef 实现灵活性1typedefintnormalInt;2typedefcharElement;#2 运用常量实现一定程度的可配置性1constnormalIntElementNumber=32;2constnormalIntindexCount=32;3constnormalIntresultIdxCount=4096;4cons
阅读全文