Zhang's Wikipedia

玩就玩大的

n 中选 m —— 随机采样的艺术

1…n 中个数随机取 m 个数,要求 1…n 中被取到的概率相同: Knuth 书中的随机数方法,很容易写出: void genkunth (int n, int m) { for (int i = 0; i < n; ++i) { if ...

2018-07-13 21:17:54

阅读数:1237

评论数:0

位图(bitmap)—— C语言实现

位图应当具备的置一,清零,以及判断三大功能: #define BITS_PER_WORD 32 #define MASK 0x1f #define SHIFT 5 // BITS_PER_WORD 与 MASK、SHIFT 是相匹配的, // 如果...

2018-07-13 20:38:50

阅读数:1323

评论数:0

C++ STL 数据结构与算法 —— 排序

1. Top k 大的数 排序后直接索引输出:O(nlogn)O(nlog⁡n)O(n\log n) std::sort(v.rbegin(), r.rend()); return v[k-1]; 使用优先队列(O(klogn)O(klog⁡n)O(k\log n),每 pop 一个元素,都...

2018-07-07 17:43:49

阅读数:1296

评论数:0

高级数据结构及应用 —— 使用 bitmap 进行字符串去重

bitmap 即为由单个元素为 boolean(0/1, 0 表示未出现,1 表示已经出现过)的数组。 如果C/C++ 没有原生的 boolean 类型,可以用 int 或 char 来作为 bitmap 使用,如果我们要判断某字符(char)是否出现过, 使用 int 作为 bitmap ...

2018-06-03 10:34:05

阅读数:694

评论数:0

二进制比特位运算

1. 基本运算 截断保留后 k 位,比如 83 == 0x0101 0011 保留后 5 位,即为 0x0001 0011 == 19 x & (pow(2, k)-1) x & 0x1f a 的第 k 位清零:a &a...

2018-06-01 22:11:11

阅读数:731

评论数:0

图的度与握手定理

在一个教职工聚会上,与会者互相握手问候彼此,每位教授会记住他/她握手的次数(以图做建模,不同的教授代表不同的点,握手表示一个边的建立,两个顶点的连接,显然是无向图,A 与 B 握手 = A 同 B 握手 + B 同 A 握手)。在聚会的最后,系主任将所有教授握手的次数相加。通过证明下面的握手定理来...

2017-07-03 08:40:47

阅读数:1520

评论数:0

图与自由树

树和图是不同的但有着密切联系的两种数据结构。自由树,是一个连通的、无环的无向图。一般情况下,我们提到一个图是树时,会省略掉形容词“自由”。称一个可能不连通的无向无环图为森林。许多树的算法对森林也适用。1. 自由树的若干性质令 G=(V,E)G=(V, E) 是一个无向图,下面的描述是等价的, GG...

2017-07-03 08:23:00

阅读数:674

评论数:0

区间树(segment tree)

区间树能够对保存的数据进行适当的预处理,以快速回复查询。区间树常用于在一维数组的特定区间对查询进行快速回复。区间树的最典型也是最简单的应用就是求区间最小值的问题。区间树的基本思路是,生成表示给定数组各区间的二叉树。

2016-10-19 18:55:31

阅读数:1625

评论数:0

从二叉堆到左式堆

设计一种类似二叉堆的堆结构,能高效地支持合并操作(即以 O(N)(最坏) 的时间处理一次 Merge),而仅使用一个数组(经典二叉堆的实现)似乎很难。 原因在于,合并似乎需要把一个数组拷贝到另一个数组中去,对于相同大小的堆这将花费 Θ(N)\Theta (N)。正因如此,所有支持高效合并的高级数据...

2016-10-01 22:29:15

阅读数:468

评论数:0

数据结构 Tricks(一)—— 父节点和左右孩子索引号之间的关系

如果通过对编号的设计,实现存取元素时,不必区分左孩子还是右孩子,直接就可确定其父节点的编号。

2016-09-25 18:48:16

阅读数:895

评论数:0

二叉堆(binary heap)—— 优先队列的实现

二叉堆因为对应着一棵完全二叉树,因而可以通过线性数组的方式实现。 注意,数组第 0 个位置上的元素,作为根,还是第 1 个位置上的元素作为根?本文给出的实现,以数组第 1 个位置上的元素作为根,则其两个孩子 ⇒ 2*i, 2*i+1 而第 0 个位置上的元素,则用来作为标志变量(Size 不包括此...

2016-09-25 18:39:27

阅读数:438

评论数:0

快慢指针 —— 链表中点

使用 快慢双指针,快指针一次走两步,慢指针一次走一步,十分 tricky;

2016-09-23 12:20:39

阅读数:450

评论数:0

HashTable 解决碰撞(冲突)的方法 —— 分离链接法(separate chaining)

1. ListNode 及 HashTable 的类型声明 2. HashTable 的创建

2016-09-21 10:17:37

阅读数:971

评论数:0

散列:散列函数与散列表(hash table)

1. 散列函数如果输入的关键字是整数,则一般合理方法是直接返回对表大小取模(Key mod TableSize)的结果,除非 Key 碰巧具有一些不太理想的特质。如,表的大小为 10,而关键字都是 10 的倍数,显然此时都会被散列在 0 的位置。为了避免上述情况的发生,好的方法是保证表的大小是素数...

2016-09-20 15:22:14

阅读数:452

评论数:0

从多路搜索树到 B-树

当数据规模大到内存已不足以容纳时(此时就需要存放在外存中),常规平衡二叉搜索树的效率将大打折扣。其原因在于,查找过程对外存的访问次数过多。例如,若将 10910^9(1 billion = 10 亿)个记录在外存中组织为 AVL 时,则每次查找大致都需要做 30 次外存访问。那么,应该如何有效减少...

2016-09-20 12:47:15

阅读数:327

评论数:0

数据局部性(data locality)

信息处理的典型模式是,将所有数据项视为一个集合,并将其组织为适宜的数据结构(或者说使用适宜的数据结构对之进行存储以及组织),进而借助操作接口高效访问。为了考查和评价各操作接口的效率,除了从最坏情况的角度出发,也可假定所有操作彼此独立、次序随机且概率均等,也即从平均情况的角度出发。然而,实际中,后一...

2016-09-20 10:53:26

阅读数:2665

评论数:0

伸展树(splay tree)

伸展树的设计思路,鉴于数据访问的局部性(28原则)在实际应用中普遍存在,将按照“最常用者优先”的启发策略。尽管在最坏情况下其单次操作需要 O(n)O(n) 时间,但分摊而言仍然 O(logn)O(\log n) 以内。与 AVL 树一样,伸展树也是平衡二叉搜索树的一种实现。

2016-09-20 10:32:04

阅读数:266

评论数:0

适度平衡树

适度平衡树,是指将树高限制为“渐进地不超过 O(logn)O(\log n)”。举例: AVL 树; 伸展树; 红黑树; kd-树; 当然这些都可以归入平衡二叉搜索树(BBST,Balanced Binary Search Tree)之列。

2016-09-20 07:57:10

阅读数:380

评论数:0

从二叉搜索树到平衡二叉搜索树

1. 树高与性能一个二叉搜索树(要求有序)需要支持的主要接口有: search() insert() remove() 三者的时间复杂度均正比于二叉树的高度。在最坏的情况下,所有的内部结点(根和叶子除外),均为左孩子结点或右孩子结点。此时的查找效率甚至会降至 O(n)O(n),线性正比于数据集的规...

2016-09-19 22:49:39

阅读数:329

评论数:0

二叉树的常用操作(节点的后继节点)

1. 一路沿左分支遍历// BinNode<T>* x;while (x){ visit(x->data); x = x->lChild; } 当然,与之相对应的右分支可以用 Stack 存储,也可以使用 Queue,视具体的程序逻辑而定;

2016-09-18 20:12:55

阅读数:626

评论数:0

提示
确定要删除当前文章?
取消 删除
关闭
关闭