跳到主要内容

clrs

简介

提供基础的数据结构和算法

组件接口

deque.gs

双端队列

实现

底层基于array实现的,通过预留空间支持快速的前端插入,各种操作的均摊效率为常数时间。

函数原型函数作用
void push_front(Deque self, mixed item)在前端插入元素
void push_back(Deque self, mixed item)在尾端插入元素
mixed pop_front(Deque self)删除并返回队首元素
mixed pop_back(Deque self)删除并返回队尾元素
mixed front(Deque self)返回队首元素
mixed back(Deque self)返回队尾元素
int size(Deque self)获取队列元素数量

heap.gs

最大堆

实现

参考Python heapq,提供作用于array的堆操作函数。

函数原型函数作用
void heapify(array arr, function predicate = nil)在O(N)时间内将数组转换成堆
void push(array arr, mixed item, function predicate = nil)将元素加入堆中,并保持堆的性质
mixed pop(array arr, function predicate = nil)弹出并返回堆的最大值,并保持堆的性质
mixed remove(array arr, int pos, function predicate = nil)从指定位置删除数据,并返回删除的数据
void heap_sort(array arr, function predicate = nil)堆排序,时间复杂度为O(N * log N)

ordered_set.gs

有序集合

  1. 尽管称为集合(set),但添加元素时(可选的)可以提供值,以支持映射。
  2. 不重复集合:当添加重复元素时,旧元素被覆盖。
  3. 要求元素支持良定义的比较,支持用户提供比较函数。
实现

基于AVL树实现的有序集合,集合操作的时间复杂度为O(log N)。

@ref AVL tree is a self-balancing Binary Search Tree (BST) where the difference between heights of left and right subtrees cannot be more than one for all nodes.

@ref https://www.guru99.com/avl-tree.html

函数原型函数作用
void add(OrderedSet self, mixed key, mixed value = nil)向集合中添加元素,如果元素已存在集合中则覆盖之
bool remove(OrderedSet self, mixed key)从集合中移除指定元素
mixed query(OrderedSet self, mixed key)从集合中取出元素映射的值
mixed lower_bound(OrderedSet self, mixed key)在集合中取出不小于key的最小元素
mixed upper_bound(OrderedSet self, mixed key)在集合中取出大于key的最小元素
mixed get_min(OrderedSet self)取出集合中的最小元素
mixed get_max(OrderedSet self)取出集合中的最大元素
int size(OrderedSet self)返回集合大小
void empty(OrderedSet self)清空集合

priority_queue.gs

优先队列

要求元素支持良定义的比较,支持用户提供比较函数。

实现

基于最大堆实现的优先队列。

函数原型函数作用
mixed top(PriorityQueue self)获取队列中的最大元素,时间复杂度为O(1)
void push(PriorityQueue self, mixed item)向队列中加入元素,时间复杂度为O(log N)
mixed pop(PriorityQueue self)从队列中弹出并返回最大元素,时间复杂度为O(log N)
mixed remove(PriorityQueue self, int pos)删除并返回指定位置的数据,时间复杂度为O(log N)
int size(PriorityQueue self)返回队列大小

stack.gs

FILO栈

函数原型函数作用
mixed top(Stack self)获取栈顶元素
void push(Stack self, mixed item)向栈中推入元素
mixed pop(Stack self)弹出并返回栈顶元素
int size(Stack self)返回栈大小

样例

public void sample()
{
load_static(clrs);

PriorityQueue pq = PriorityQueue.new();

pq.push(5);
pq.push(3);
pq.push(10);

// 10
printf("%d\n", pq.pop());
// 5
printf("%d\n", pq.pop());
// 3
printf("%d\n", pq.pop());
}