
数据结构
偏test
这个作者很懒,什么都没留下…
展开
-
malloc的基本实现
一直对malloc的实现不是很懂,K&R的C程序设计语言的8.7节讲了一个malloc的基本实现,这篇文章主要把自己的理解记录一下。 malloc是在堆里申请空间的,每一次申请的空间叫做内存块,每个内存块包括头部和数据区,空闲的内存块通过一个循环链表组织在一起,内存块的地址是从低到高排列的,这是由堆的地址是从低到高生长决定的,链表有一个表头,表头不包含数据区。原创 2017-12-12 00:30:42 · 954 阅读 · 0 评论 -
四国军棋引擎开发(3)寻找到军旗的最短路径
1.问题描述本来打算接下来做α-β剪枝算法,但是我觉得还是要先解决下棋时一个非常蠢的问题,就是军旗都在旁边了却不懂得去挖。这里要解决的算法就是寻找本方棋子到对方军旗的通路,还要在所有通路中寻找最少步数的路径。这是一个非常有意思的算法场景,所以特地为这个问题来写一篇文章。 如下图所示,此时到军旗的路径有绿色和黄色2条,首先要把这2条路径找出来,然后由于绿色路径的长度是4,而黄色路径的长度是3,...原创 2018-09-09 09:30:01 · 1384 阅读 · 0 评论 -
四国军棋界面开发(4) 行棋规则和工兵路径
现在开始来实现界面开发过程中最关键的部分,也就是行棋路线的合法性判断,这里工兵路径的判定是一个主要的难点,在此基础上再加上线路只能走直线的条件就可以得到其他棋子在铁道上的行棋规则。1.路径箭头每一次行棋,都需要在行棋的线路上加上箭头来表示行棋路径,先获取8个方向上的箭头素材 把图中的小箭头裁剪下来放在pJunqi->paArrowPixbuf的数组里,此后在需要添加路径时通...原创 2018-08-07 17:54:03 · 2361 阅读 · 0 评论 -
面试题:二叉树分层遍历和两炷香的问题
今天去面试了,有2道题没做出来,发现自己做题真的不行啊,晚上恶补。1 二叉树分层遍历二叉树遍历,要求从上往下遍历每一层,在每一层里从左往右遍历。题目里提示用队列,一直没想出来队列怎么用,后来自己想一下,直接用2个链表就搞定了,一个链表存储上一层结点,另外一个链表存储下一层结点。#include<stdio.h>#include<stdlib.h>#inclu...原创 2018-07-20 00:08:59 · 338 阅读 · 0 评论 -
B-tree算法需求分析及实现
1. 基本需求考虑在磁盘文件上存储一张数据表,每张表有很多记录,暂时假定每个记录所存储的空间长度是相同的,每个记录有一个唯一的索引。操作系统对文件的读写是以页为单位的,每页长度为4096字节,现在需要对这张表中的记录进行插入、查找、删除操作。不考虑时间和内存的性能,最简单的思路就是遍历每一页,在页中遍历每一个记录,查找给定的记录,如果记录不在这一页中再查找下一页,删除时只要找到对应的记录将其清空即...原创 2018-06-28 14:07:45 · 2637 阅读 · 0 评论 -
SQLite3源码学习(27) Bitmap算法
1. 算法背景 假如有100个不重复的数存放在文件里,怎么确定某个数是否在这100个数中? 一般可以这样做,将这100个数读取到内存并存放在char a[100]的数组里,只需遍历这100个数即可。 那么假如有10亿个不重复的数呢,最大的数是2^32-1,这个时候显然内存存放不了那么多数,那么只能先将一部分数据读到内存,做完判断后再去读一部分数据,直...原创 2018-05-12 07:33:14 · 767 阅读 · 0 评论 -
SQLite3源码学习(23) 链表的归并排序
一般数组排序采用快速排序最佳,但是在链表中2个元素的交换不是很方便,所以采用归并排序比较好,先把链表分割成一些已经排好序的子链表,最后再串起来就好了。在SQLite中对于脏页链表按照页号重新排序采用的就是归并排序。1.基本思路 子链表存放在一个临时数组里,这个数组定义为PgHdr *a[N_SORT_BUCKET]子链表是按照2的幂次方的大小依次存放,也就是说a[0]存放1个元素,a[1...原创 2018-04-08 23:48:36 · 384 阅读 · 0 评论 -
SQLite3源码学习(15) 零-内存分配器buddy算法
1.概述 SQLite开发者称它为"memsys5",这个内存分配器的实现不依赖于malloc,实现在mem5.c里,使用时需要打开SQLITE_ENABLE_MEMSYS5编译选项,应用程序在启动时还要调用以下接口: sqlite3_config(SQLITE_CONFIG_HEAP, pBuf, szBuf, mnReq); 其中pBuf为初始内存,szBuf为初始内存大小,mnReq为原创 2018-03-03 20:45:06 · 885 阅读 · 0 评论 -
1133. Splitting A Linked List (25)
网上看到一道不错的题目,做了一下感觉对链表的理解有很大的帮助。题目的意思是给定一个正数K和一个链表 ,把链表的节点分成3类输出,先输出负数,再输出小于K的非负数,最后输出大于K的数,每一类输出保持原来的相对顺序不变。 比如给定链表18→7→-4→0→5→-6→10→11→-2和K=10,输出-4→-6→-2→7→0→5→10→18→11。正式输入时第一行为首节点地址,节点数和K值,后面每行分别输原创 2017-11-11 23:30:34 · 242 阅读 · 0 评论 -
四国军棋引擎开发(6)alpha-beta剪枝算法
在讲alpha-beta剪枝算法之前先要了解最大最小算法,在棋类游戏中,给每一个局面打一个分数,轮到自己下时会选择有利于自己的下法,即选择局面分数高的,而对手会选择更加不利于自己的局面,即分数最低的。如下图所示,max结点会选择分数最高的子结点作为分值,而min结点会选择分数低的,最后得到根结点的分数。在上图中为了确定最后根结点的值,我们要查询所有叶子结点的值,事实上没有必要查询所有叶子的值,...原创 2018-09-30 15:18:48 · 2418 阅读 · 0 评论