rbtree.c
/**
* C語(yǔ)言實(shí)現(xiàn)的紅黑樹(shù)(Red Black Tree)
*
* @author skywang
* @date 2013/11/18
*/
#include
#include
#include "rbtree.h"
#define rb_parent(r) ((r)->parent)
#define rb_color(r) ((r)->color)
#define rb_is_red(r) ((r)->color==RED)
#define rb_is_black(r) ((r)->color==BLACK)
#define rb_set_black(r) do { (r)->color = BLACK; } while (0)
#define rb_set_red(r) do { (r)->color = RED; } while (0)
#define rb_set_parent(r,p) do { (r)->parent = (p); } while (0)
#define rb_set_color(r,c) do { (r)->color = (c); } while (0)
/*
* 創(chuàng)建紅黑樹(shù),返回"紅黑樹(shù)的根"!
*/
RBRoot* create_rbtree()
{
RBRoot *root = (RBRoot *)malloc(sizeof(RBRoot));
root->node = NULL;
return root;
}
/*
* 前序遍歷"紅黑樹(shù)"
*/
static void preorder(RBTree tree)
{
if(tree != NULL)
{
printf("%d ", tree->key);
preorder(tree->left);
preorder(tree->right);
}
}
void preorder_rbtree(RBRoot *root)
{
if (root)
preorder(root->node);
}
/*
* 中序遍歷"紅黑樹(shù)"
*/
static void inorder(RBTree tree)
{
if(tree != NULL)
{
inorder(tree->left);
printf("%d ", tree->key);
inorder(tree->right);
}
}
void inorder_rbtree(RBRoot *root)
{
if (root)
inorder(root->node);
}
/*
* 后序遍歷"紅黑樹(shù)"
*/
static void postorder(RBTree tree)
{
if(tree != NULL)
{
postorder(tree->left);
postorder(tree->right);
printf("%d ", tree->key);
}
}
void postorder_rbtree(RBRoot *root)
{
if (root)
postorder(root->node);
}
/*
* (遞歸實(shí)現(xiàn))查找"紅黑樹(shù)x"中鍵值為key的節(jié)點(diǎn)
*/
static Node* search(RBTree x, Type key)
{
if (x==NULL || x->key==key)
return x;
if (key < x->key)
return search(x->left, key);
else
return search(x->right, key);
}
int rbtree_search(RBRoot *root, Type key)
{
if (root)
return search(root->node, key)? 0 : -1;
}
/*
* (非遞歸實(shí)現(xiàn))查找"紅黑樹(shù)x"中鍵值為key的節(jié)點(diǎn)
*/
static Node* iterative_search(RBTree x, Type key)
{
while ((x!=NULL) && (x->key!=key))
{
if (key < x->key)
x = x->left;
else
x = x->right;
}
return x;
}
int iterative_rbtree_search(RBRoot *root, Type key)
{
if (root)
return iterative_search(root->node, key) ? 0 : -1;
}
/*
* 查找最小結(jié)點(diǎn):返回tree為根結(jié)點(diǎn)的紅黑樹(shù)的最小結(jié)點(diǎn)。
*/
static Node* minimum(RBTree tree)
{
if (tree == NULL)
return NULL;
while(tree->left != NULL)
tree = tree->left;
return tree;
}
int rbtree_minimum(RBRoot *root, int *val)
{
Node *node;
if (root)
node = minimum(root->node);
if (node == NULL)
return -1;
*val = node->key;
return 0;
}
/*
* 查找最大結(jié)點(diǎn):返回tree為根結(jié)點(diǎn)的紅黑樹(shù)的最大結(jié)點(diǎn)。
*/
static Node* maximum(RBTree tree)
{
if (tree == NULL)
return NULL;
while(tree->right != NULL)
tree = tree->right;
return tree;
}
int rbtree_maximum(RBRoot *root, int *val)
{
Node *node;
if (root)
node = maximum(root->node);
if (node == NULL)
return -1;
*val = node->key;
return 0;
}
/*
* 找結(jié)點(diǎn)(x)的后繼結(jié)點(diǎn)。即,查找"紅黑樹(shù)中數(shù)據(jù)值大于該結(jié)點(diǎn)"的"最小結(jié)點(diǎn)"。
*/
static Node* rbtree_successor(RBTree x)
{
// 如果x存在右孩子,則"x的后繼結(jié)點(diǎn)"為 "以其右孩子為根的子樹(shù)的最小結(jié)點(diǎn)"。
if (x->right != NULL)
return minimum(x->right);
// 如果x沒(méi)有右孩子。則x有以下兩種可能:
// (01) x是"一個(gè)左孩子",則"x的后繼結(jié)點(diǎn)"為 "它的父結(jié)點(diǎn)"。
// (02) x是"一個(gè)右孩子",則查找"x的最低的父結(jié)點(diǎn),并且該父結(jié)點(diǎn)要具有左孩子",找到的這個(gè)"最低的父結(jié)點(diǎn)"就是"x的后繼結(jié)點(diǎn)"。
Node* y = x->parent;
while ((y!=NULL) && (x==y->right))
{
x = y;
y = y->parent;
}
return y;
}
/*
* 找結(jié)點(diǎn)(x)的前驅(qū)結(jié)點(diǎn)。即,查找"紅黑樹(shù)中數(shù)據(jù)值小于該結(jié)點(diǎn)"的"最大結(jié)點(diǎn)"。
*/
static Node* rbtree_predecessor(RBTree x)
{
// 如果x存在左孩子,則"x的前驅(qū)結(jié)點(diǎn)"為 "以其左孩子為根的子樹(shù)的最大結(jié)點(diǎn)"。
if (x->left != NULL)
return maximum(x->left);
// 如果x沒(méi)有左孩子。則x有以下兩種可能:
// (01) x是"一個(gè)右孩子",則"x的前驅(qū)結(jié)點(diǎn)"為 "它的父結(jié)點(diǎn)"。
// (01) x是"一個(gè)左孩子",則查找"x的最低的父結(jié)點(diǎn),并且該父結(jié)點(diǎn)要具有右孩子",找到的這個(gè)"最低的父結(jié)點(diǎn)"就是"x的前驅(qū)結(jié)點(diǎn)"。
Node* y = x->parent;
while ((y!=NULL) && (x==y->left))
{
x = y;
y = y->parent;
}
return y;
}
/*
* 對(duì)紅黑樹(shù)的節(jié)點(diǎn)(x)進(jìn)行左旋轉(zhuǎn)
*
* 左旋示意圖(對(duì)節(jié)點(diǎn)x進(jìn)行左旋):
* px px
* / /
* x y
* / \\ --(左旋)--> / \\ #
* lx y x ry
* / \\ / \\
* ly ry lx ly
*
*
*/
static void rbtree_left_rotate(RBRoot *root, Node *x)
{
// 設(shè)置x的右孩子為y
Node *y = x->right;
// 將 “y的左孩子” 設(shè)為 “x的右孩子”;
// 如果y的左孩子非空,將 “x” 設(shè)為 “y的左孩子的父親”
x->right = y->left;
if (y->left != NULL)
y->left->parent = x;
// 將 “x的父親” 設(shè)為 “y的父親”
y->parent = x->parent;
if (x->parent == NULL)
{
//tree = y; // 如果 “x的父親” 是空節(jié)點(diǎn),則將y設(shè)為根節(jié)點(diǎn)
root->node = y; // 如果 “x的父親” 是空節(jié)點(diǎn),則將y設(shè)為根節(jié)點(diǎn)
}
else
{
if (x->parent->left == x)
x->parent->left = y; // 如果 x是它父節(jié)點(diǎn)的左孩子,則將y設(shè)為“x的父節(jié)點(diǎn)的左孩子”
else
x->parent->right = y; // 如果 x是它父節(jié)點(diǎn)的左孩子,則將y設(shè)為“x的父節(jié)點(diǎn)的左孩子”
}
// 將 “x” 設(shè)為 “y的左孩子”
y->left = x;
// 將 “x的父節(jié)點(diǎn)” 設(shè)為 “y”
x->parent = y;
}
/*
* 對(duì)紅黑樹(shù)的節(jié)點(diǎn)(y)進(jìn)行右旋轉(zhuǎn)
*
* 右旋示意圖(對(duì)節(jié)點(diǎn)y進(jìn)行左旋):
* py py
* / /
* y x
* / \\ --(右旋)--> / \\ #
* x ry lx y
* / \\ / \\ #
* lx rx rx ry
*
*/
static void rbtree_right_rotate(RBRoot *root, Node *y)
{
// 設(shè)置x是當(dāng)前節(jié)點(diǎn)的左孩子。
Node *x = y->left;
// 將 “x的右孩子” 設(shè)為 “y的左孩子”;
// 如果"x的右孩子"不為空的話(huà),將 “y” 設(shè)為 “x的右孩子的父親”
y->left = x->right;
if (x->right != NULL)
x->right->parent = y;
// 將 “y的父親” 設(shè)為 “x的父親”
x->parent = y->parent;
if (y->parent == NULL)
{
//tree = x; // 如果 “y的父親” 是空節(jié)點(diǎn),則將x設(shè)為根節(jié)點(diǎn)
root->node = x; // 如果 “y的父親” 是空節(jié)點(diǎn),則將x設(shè)為根節(jié)點(diǎn)
}
else
{
if (y == y->parent->right)
y->parent->right = x; // 如果 y是它父節(jié)點(diǎn)的右孩子,則將x設(shè)為“y的父節(jié)點(diǎn)的右孩子”
else
y->parent->left = x; // (y是它父節(jié)點(diǎn)的左孩子) 將x設(shè)為“x的父節(jié)點(diǎn)的左孩子”
}
// 將 “y” 設(shè)為 “x的右孩子”
x->right = y;
// 將 “y的父節(jié)點(diǎn)” 設(shè)為 “x”
y->parent = x;
}
/*
* 紅黑樹(shù)插入修正函數(shù)
*
* 在向紅黑樹(shù)中插入節(jié)點(diǎn)之后(失去平衡),再調(diào)用該函數(shù);
* 目的是將它重新塑造成一顆紅黑樹(shù)。
*
* 參數(shù)說(shuō)明:
* root 紅黑樹(shù)的根
* node 插入的結(jié)點(diǎn) // 對(duì)應(yīng)《算法導(dǎo)論》中的z
*/
static void rbtree_insert_fixup(RBRoot *root, Node *node)
{
Node *parent, *gparent;
// 若“父節(jié)點(diǎn)存在,并且父節(jié)點(diǎn)的顏色是紅色”
while ((parent = rb_parent(node)) && rb_is_red(parent))
{
gparent = rb_parent(parent);
//若“父節(jié)點(diǎn)”是“祖父節(jié)點(diǎn)的左孩子”
if (parent == gparent->left)
{
// Case 1條件:叔叔節(jié)點(diǎn)是紅色
{
Node *uncle = gparent->right;
if (uncle && rb_is_red(uncle))
{
rb_set_black(uncle);
rb_set_black(parent);
rb_set_red(gparent);
node = gparent;
continue;
}
}
// Case 2條件:叔叔是黑色,且當(dāng)前節(jié)點(diǎn)是右孩子
if (parent->right == node)
{
Node *tmp;
rbtree_left_rotate(root, parent);
tmp = parent;
parent = node;
node = tmp;
}
// Case 3條件:叔叔是黑色,且當(dāng)前節(jié)點(diǎn)是左孩子。
rb_set_black(parent);
rb_set_red(gparent);
rbtree_right_rotate(root, gparent);
}
else//若“z的父節(jié)點(diǎn)”是“z的祖父節(jié)點(diǎn)的右孩子”
{
// Case 1條件:叔叔節(jié)點(diǎn)是紅色
{
Node *uncle = gparent->left;
if (uncle && rb_is_red(uncle))
{
rb_set_black(uncle);
rb_set_black(parent);
rb_set_red(gparent);
node = gparent;
continue;
}
}
// Case 2條件:叔叔是黑色,且當(dāng)前節(jié)點(diǎn)是左孩子
if (parent->left == node)
{
Node *tmp;
rbtree_right_rotate(root, parent);
tmp = parent;
parent = node;
node = tmp;
}
// Case 3條件:叔叔是黑色,且當(dāng)前節(jié)點(diǎn)是右孩子。
rb_set_black(parent);
rb_set_red(gparent);
rbtree_left_rotate(root, gparent);
}
}
// 將根節(jié)點(diǎn)設(shè)為黑色
rb_set_black(root->node);
}
/*
* 添加節(jié)點(diǎn):將節(jié)點(diǎn)(node)插入到紅黑樹(shù)中
*
* 參數(shù)說(shuō)明:
* root 紅黑樹(shù)的根
* node 插入的結(jié)點(diǎn) // 對(duì)應(yīng)《算法導(dǎo)論》中的z
*/
static void rbtree_insert(RBRoot *root, Node *node)
{
Node *y = NULL;
Node *x = root->node;
// 1. 將紅黑樹(shù)當(dāng)作一顆二叉查找樹(shù),將節(jié)點(diǎn)添加到二叉查找樹(shù)中。
while (x != NULL)
{
y = x;
if (node->key < x->key)
x = x->left;
else
x = x->right;
}
rb_parent(node) = y;
if (y != NULL)
{
if (node->key < y->key)
y->left = node; // 情況2:若“node所包含的值” < “y所包含的值”,則將node設(shè)為“y的左孩子”
else
y->right = node; // 情況3:(“node所包含的值” >= “y所包含的值”)將node設(shè)為“y的右孩子”
}
else
{
root->node = node; // 情況1:若y是空節(jié)點(diǎn),則將node設(shè)為根
}
// 2. 設(shè)置節(jié)點(diǎn)的顏色為紅色
node->color = RED;
// 3. 將它重新修正為一顆二叉查找樹(shù)
rbtree_insert_fixup(root, node);
}
/*
* 創(chuàng)建結(jié)點(diǎn)
*
* 參數(shù)說(shuō)明:
* key 是鍵值。
* parent 是父結(jié)點(diǎn)。
* left 是左孩子。
* right 是右孩子。
*/
static Node* create_rbtree_node(Type key, Node *parent, Node *left, Node* right)
{
Node* p;
if ((p = (Node *)malloc(sizeof(Node))) == NULL)
return NULL;
p->key = key;
p->left = left;
p->right = right;
p->parent = parent;
p->color = BLACK; // 默認(rèn)為黑色
return p;
}
/*
* 新建結(jié)點(diǎn)(節(jié)點(diǎn)鍵值為key),并將其插入到紅黑樹(shù)中
*
* 參數(shù)說(shuō)明:
* root 紅黑樹(shù)的根
* key 插入結(jié)點(diǎn)的鍵值
* 返回值:
* 0,插入成功
* -1,插入失敗
*/
int insert_rbtree(RBRoot *root, Type key)
{
Node *node; // 新建結(jié)點(diǎn)
// 不允許插入相同鍵值的節(jié)點(diǎn)。
// (若想允許插入相同鍵值的節(jié)點(diǎn),注釋掉下面兩句話(huà)即可!)
if (search(root->node, key) != NULL)
return -1;
// 如果新建結(jié)點(diǎn)失敗,則返回。
if ((node=create_rbtree_node(key, NULL, NULL, NULL)) == NULL)
return -1;
rbtree_insert(root, node);
return 0;
}
/*
* 紅黑樹(shù)刪除修正函數(shù)
*
* 在從紅黑樹(shù)中刪除插入節(jié)點(diǎn)之后(紅黑樹(shù)失去平衡),再調(diào)用該函數(shù);
* 目的是將它重新塑造成一顆紅黑樹(shù)。
*
* 參數(shù)說(shuō)明:
* root 紅黑樹(shù)的根
* node 待修正的節(jié)點(diǎn)
*/
static void rbtree_delete_fixup(RBRoot *root, Node *node, Node *parent)
{
Node *other;
while ((!node || rb_is_black(node)) && node != root->node)
{
if (parent->left == node)
{
other = parent->right;
if (rb_is_red(other))
{
// Case 1: x的兄弟w是紅色的
rb_set_black(other);
rb_set_red(parent);
rbtree_left_rotate(root, parent);
other = parent->right;
}
if ((!other->left || rb_is_black(other->left)) &&
(!other->right || rb_is_black(other->right)))
{
// Case 2: x的兄弟w是黑色,且w的倆個(gè)孩子也都是黑色的
rb_set_red(other);
node = parent;
parent = rb_parent(node);
}
else
{
if (!other->right || rb_is_black(other->right))
{
// Case 3: x的兄弟w是黑色的,并且w的左孩子是紅色,右孩子為黑色。
rb_set_black(other->left);
rb_set_red(other);
rbtree_right_rotate(root, other);
other = parent->right;
}
// Case 4: x的兄弟w是黑色的;并且w的右孩子是紅色的,左孩子任意顏色。
rb_set_color(other, rb_color(parent));
rb_set_black(parent);
rb_set_black(other->right);
rbtree_left_rotate(root, parent);
node = root->node;
break;
}
}
else
{
other = parent->left;
if (rb_is_red(other))
{
// Case 1: x的兄弟w是紅色的
rb_set_black(other);
rb_set_red(parent);
rbtree_right_rotate(root, parent);
other = parent->left;
}
if ((!other->left || rb_is_black(other->left)) &&
(!other->right || rb_is_black(other->right)))
{
// Case 2: x的兄弟w是黑色,且w的倆個(gè)孩子也都是黑色的
rb_set_red(other);
node = parent;
parent = rb_parent(node);
}
else
{
if (!other->left || rb_is_black(other->left))
{
// Case 3: x的兄弟w是黑色的,并且w的左孩子是紅色,右孩子為黑色。
rb_set_black(other->right);
rb_set_red(other);
rbtree_left_rotate(root, other);
other = parent->left;
}
// Case 4: x的兄弟w是黑色的;并且w的右孩子是紅色的,左孩子任意顏色。
rb_set_color(other, rb_color(parent));
rb_set_black(parent);
rb_set_black(other->left);
rbtree_right_rotate(root, parent);
node = root->node;
break;
}
}
}
if (node)
rb_set_black(node);
}
/*
* 刪除結(jié)點(diǎn)
*
* 參數(shù)說(shuō)明:
* tree 紅黑樹(shù)的根結(jié)點(diǎn)
* node 刪除的結(jié)點(diǎn)
*/
void rbtree_delete(RBRoot *root, Node *node)
{
Node *child, *parent;
int color;
// 被刪除節(jié)點(diǎn)的"左右孩子都不為空"的情況。
if ( (node->left!=NULL) && (node->right!=NULL) )
{
// 被刪節(jié)點(diǎn)的后繼節(jié)點(diǎn)。(稱(chēng)為"取代節(jié)點(diǎn)")
// 用它來(lái)取代"被刪節(jié)點(diǎn)"的位置,然后再將"被刪節(jié)點(diǎn)"去掉。
Node *replace = node;
// 獲取后繼節(jié)點(diǎn)
replace = replace->right;
while (replace->left != NULL)
replace = replace->left;
// "node節(jié)點(diǎn)"不是根節(jié)點(diǎn)(只有根節(jié)點(diǎn)不存在父節(jié)點(diǎn))
if (rb_parent(node))
{
if (rb_parent(node)->left == node)
rb_parent(node)->left = replace;
else
rb_parent(node)->right = replace;
}
else
// "node節(jié)點(diǎn)"是根節(jié)點(diǎn),更新根節(jié)點(diǎn)。
root->node = replace;
// child是"取代節(jié)點(diǎn)"的右孩子,也是需要"調(diào)整的節(jié)點(diǎn)"。
// "取代節(jié)點(diǎn)"肯定不存在左孩子!因?yàn)樗且粋€(gè)后繼節(jié)點(diǎn)。
child = replace->right;
parent = rb_parent(replace);
// 保存"取代節(jié)點(diǎn)"的顏色
color = rb_color(replace);
// "被刪除節(jié)點(diǎn)"是"它的后繼節(jié)點(diǎn)的父節(jié)點(diǎn)"
if (parent == node)
{
parent = replace;
}
else
{
// child不為空
if (child)
rb_set_parent(child, parent);
parent->left = child;
replace->right = node->right;
rb_set_parent(node->right, replace);
}
replace->parent = node->parent;
replace->color = node->color;
replace->left = node->left;
node->left->parent = replace;
if (color == BLACK)
rbtree_delete_fixup(root, child, parent);
free(node);
return ;
}
if (node->left !=NULL)
child = node->left;
else
child = node->right;
parent = node->parent;
// 保存"取代節(jié)點(diǎn)"的顏色
color = node->color;
if (child)
child->parent = parent;
// "node節(jié)點(diǎn)"不是根節(jié)點(diǎn)
if (parent)
{
if (parent->left == node)
parent->left = child;
else
parent->right = child;
}
else
root->node = child;
if (color == BLACK)
rbtree_delete_fixup(root, child, parent);
free(node);
}
/*
* 刪除鍵值為key的結(jié)點(diǎn)
*
* 參數(shù)說(shuō)明:
* tree 紅黑樹(shù)的根結(jié)點(diǎn)
* key 鍵值
*/
void delete_rbtree(RBRoot *root, Type key)
{
Node *z, *node;
if ((z = search(root->node, key)) != NULL)
rbtree_delete(root, z);
}
/*
* 銷(xiāo)毀紅黑樹(shù)
*/
static void rbtree_destroy(RBTree tree)
{
if (tree==NULL)
return ;
if (tree->left != NULL)
rbtree_destroy(tree->left);
if (tree->right != NULL)
rbtree_destroy(tree->right);
free(tree);
}
void destroy_rbtree(RBRoot *root)
{
if (root != NULL)
rbtree_destroy(root->node);
free(root);
}
/*
* 打印"紅黑樹(shù)"
*
* tree -- 紅黑樹(shù)的節(jié)點(diǎn)
* key -- 節(jié)點(diǎn)的鍵值
* direction -- 0,表示該節(jié)點(diǎn)是根節(jié)點(diǎn);
* -1,表示該節(jié)點(diǎn)是它的父結(jié)點(diǎn)的左孩子;
* 1,表示該節(jié)點(diǎn)是它的父結(jié)點(diǎn)的右孩子。
*/
static void rbtree_print(RBTree tree, Type key, int direction)
{
if(tree != NULL)
{
if(direction==0) // tree是根節(jié)點(diǎn)
printf("%2d(B) is root\\n", tree->key);
else // tree是分支節(jié)點(diǎn)
printf("%2d(%s) is %2d's %6s child\\n", tree->key, rb_is_red(tree)?"R":"B", key, direction==1?"right" : "left");
rbtree_print(tree->left, tree->key, -1);
rbtree_print(tree->right,tree->key, 1);
}
}
void print_rbtree(RBRoot *root)
{
if (root!=NULL && root->node!=NULL)
rbtree_print(root->node, root->node->key, 0);
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
6820瀏覽量
88748 -
代碼
+關(guān)注
關(guān)注
30文章
4723瀏覽量
68242 -
查找算法
+關(guān)注
關(guān)注
0文章
6瀏覽量
5523
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
STM32 library、應(yīng)用、源代碼等資料 歸檔貼(查找方便)
/jishu_423003_1_1.htmlSTM32F1,STM32F2,STM32F4 外設(shè)固件封裝庫(kù) 含源碼和libhttps://bbs.elecfans.com/jishu_419945_1_1.html芯達(dá)stm32源代碼
發(fā)表于 04-01 11:05
簡(jiǎn)單的查找算法
幾個(gè)比較基礎(chǔ)的查找算法:1. 無(wú)序鏈表的查找:主要是使用鏈表的遍歷操作來(lái)實(shí)現(xiàn)對(duì)于每個(gè)元素的訪(fǎng)問(wèn),和對(duì)比。通過(guò)在for循環(huán)中的if來(lái)判斷key相等的元素。如果找到就彈出val。如果沒(méi)有就返回null
發(fā)表于 12-27 22:33
isis 7 professional_元件查找代碼
isis 7 professional元件查找代碼有各總isis 7 professional元件的查找代碼
發(fā)表于 12-08 15:58
?7次下載
圖論算法及MATLAB程序代碼的詳細(xì)資料說(shuō)明
本文檔的主要內(nèi)容詳細(xì)介紹的是圖論算法及MATLAB程序代碼的詳細(xì)資料說(shuō)明。
發(fā)表于 04-23 08:00
?0次下載
自動(dòng)機(jī)終結(jié)字查找算法實(shí)現(xiàn)優(yōu)化綜述
|4)的自動(dòng)機(jī)終結(jié)字查找算法,該算法是至今僅有的專(zhuān)門(mén)用于計(jì)算自動(dòng)機(jī)的終結(jié)字的算法。以現(xiàn)有同步自動(dòng)機(jī)的同步字
發(fā)表于 04-28 15:49
?3次下載
匯總常見(jiàn)單片機(jī)原廠(chǎng)代碼倉(cāng)庫(kù),值得收藏
匯總常見(jiàn)單片機(jī)原廠(chǎng)代碼倉(cāng)庫(kù),值得收藏
發(fā)表于 12-03 16:06
?9次下載
常見(jiàn)的查找算法匯總(含詳細(xì)代碼)1
今天就把常見(jiàn)*查找算法也總結(jié)個(gè)通透, 還有詳細(xì)的代碼解釋?zhuān)?真的是寫(xiě)完這篇感覺(jué)腦子已經(jīng)不是自己的了,還希望大家好好利用。
常見(jiàn)的查找算法匯總(含詳細(xì)代碼)2
今天就把常見(jiàn)****查找算法也總結(jié)個(gè)通透, 還有詳細(xì)的代碼解釋?zhuān)?真的是寫(xiě)完這篇感覺(jué)腦子已經(jīng)不是自己的了,還希望大家好好利用。
常見(jiàn)的查找算法匯總(含詳細(xì)代碼)3
今天就把常見(jiàn)****查找算法也總結(jié)個(gè)通透, 還有詳細(xì)的代碼解釋?zhuān)?真的是寫(xiě)完這篇感覺(jué)腦子已經(jīng)不是自己的了,還希望大家好好利用。
常見(jiàn)的查找算法匯總(含詳細(xì)代碼)5
今天就把常見(jiàn)****查找算法也總結(jié)個(gè)通透, 還有詳細(xì)的代碼解釋?zhuān)?真的是寫(xiě)完這篇感覺(jué)腦子已經(jīng)不是自己的了,還希望大家好好利用。
評(píng)論