一个特别的纪念日
- 机缘
- 收获
- 日常
- 成就
- 憧憬
💡一个热爱分享高性能服务器后台开发知识的博主,目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。技能涵盖了多个领域,包括C/C++、Linux、中间件、数据库、云原生、网络协议栈、分布式架构等。
👉
🎖️ CSDN实力新星、CSDN博客专家、华为云云享专家、阿里云专家博主
👉
今天收到CSDN的通知,不知不觉已经加入CSDN成为创作者5年啦。让我来写第一篇记录自己的创作之旅的文章吧。
机缘
2018年9月6日,那时候是一个刚毕业的小白,我一直对技术深感兴趣,认为它们能够改变世界,以及连接不同的文化和观点。怀着对技术的热爱,加入了CSDN,成为一位创作者,最开始的创作目的是为了记录学习、分享经验,在让自己变得更好的同时帮助他人;同时可以让更加优秀的人发现并指正自己的不足。
我一直热衷于学习新的事物,尤其是技术方面的知识。我希望将所学到的知识与他人分享,帮助他们解决问题,激发他们的创造力,这种愿望驱使我通过文章表达来传播我的经验和见解。
成为创作者的这五年,虽然中间出现过停更,但是基于对创作的热爱、对影响他人的渴望以及对知识分享的执着。这些初心一直激励着我坚持追随创作之路,不断成长和进步。
创作对我来说不仅是一种方式,更是一种生活的意义。它让我能够表达自己、成长、与他人互动,以及发现生活的美丽和深度。
- 在不断地创作过程中,可以学到如何思考、如何观察、如何解决问题,以及如何不断提高自己的技能和才华。这种学习过程是持续的,让我能够不断进步,不断挑战自己,不断探索新的领域和可能性。
- 创作提供了与他人互动和分享的机会。通过作品,能够与读者建立联系,传达经验。这种互动不仅能感到帮助的快乐,还可以理解其他人的观点。
- 创作赋予了我的日常生活更多的色彩和深度,创作不仅是一种兴趣和爱好,更是一种生活方式,它激发了人的激情和动力。
收获
这五年的创作之旅也让我收获颇大。从最开始的创作小白成为了现在的博客专家。
我不善于运维,也没有太多的时间去做这些,所以目前为止仅有四千多的读者关注,但我相信,创作的文章的影响不仅仅只有四千多,因为总的访问量高达37万+,而最近才上线的代码分享记录也达到了2000+。
此外,不得不说CSDN的电子勋章是非常好看的。
当然,实体的勋章和证书也少不了。
日常
创作不仅是一种输出,还是一种输入。通过创作,我不断学习和研究各种主题。这不仅有助于在工作和学术领域中保持竞争力,还让我享受到不断学习的乐趣。现在创作基本成为了生活中的一部分,基本上每周都会写两篇文章,如果时间充裕,甚至是日更一篇。
目前对《C++从零开始到精通》专栏的更新接近了尾声,接下来的一段时间会更多的更新《Linux后台开发技术》专栏。但也会有其他的技术和经验分享。
成就
最好的一段代码太多了,贴一个最近的实践代码吧,红黑树的C语言实现:
#define KEY_TYPE int
enum RB_COLOR{RED=0,BLACK};
#if 0
#define RBTREE_ENTRY(name,type)\
struct name \
{ \
struct _rbtree_node* left; \
struct _rbtree_node* right; \
struct _rbtree_node* parent; \
unsigned char color; \
}
#endif
typedef struct _rbtree_node
{
/* data */
KEY_TYPE key;
void* value;
struct _rbtree_node* left;
struct _rbtree_node* right;
struct _rbtree_node* parent;
unsigned char color;
#if 0
RBTREE_ENTRY(,_rbtree_node) node;
// RBTREE_ENTRY(,_rbtree_node) node2;
// RBTREE_ENTRY(,_rbtree_node) node3;
#endif
}rbtree_node;
typedef struct _RedBlackTree
{
/* data */
rbtree_node *root;
rbtree_node *nil;
}RedBlackTree;
static void rbtree_left_rotate(RedBlackTree *T,rbtree_node *x)
{
rbtree_node *y = x->right;
// 1
x->right=y->left;
if(y->left != T->nil)
y->left->parent=x;
// 2
y->parent=x->parent;
if(x->parent==T->nil)
T->root=y;
else if(x==x->parent->left)
x->parent->left=y;
else
x->parent->right=y;
// 3
y->left=x;
x->parent=y;
}
static void rbtree_right_rotate(RedBlackTree *T,rbtree_node *y)
{
rbtree_node *x = y->left;
// 1
y->left=x->right;
if(x->right != T->nil)
x->right->parent=y;
// 2
x->parent=y->parent;
if(y->parent==T->nil)
T->root=x;
else if(y==y->parent->right)
y->parent->right=x;
else
y->parent->left=x;
// 3
x->right=y;
y->parent=x;
}
void rbtree_insert_fixup(RedBlackTree *T,rbtree_node *z)
{
// z->color == RED
while(z->parent->color==RED)
{
if(z->parent==z->parent->parent->left)
{
// The parent of z is the left subtree of the grandfather
rbtree_node *y=z->parent->parent->right;
if(y->color==RED)
{
y->color=BLACK;
z->parent->color=BLACK;
z->parent->parent->color=RED;
// You have to make sure Z is red every time you go through it.
z=z->parent->parent;// z->color == RED
}
else
{
//This cannot be done in one step, it must be done in the middle:
// The state with a large number of nodes on the left is easy to rotate.
if(z->parent->right==z)
{
z=z->parent;
rbtree_left_rotate(T,z);
}
// The number of nodes to the left of the root node is large
// Especially if you have two red nodes bordering each other.
// Need to rotate.
// Change the color, and then rotate
z->parent->color=BLACK;
z->parent->parent->color=RED;
rbtree_right_rotate(T,z->parent->parent);
}
}
else
{// The parent of z is the right subtree of the grandfather
rbtree_node *y=z->parent->parent->left;
if(y->color==RED)// Uncle node is red
{
z->parent->parent->color=RED;
z->parent->color=BLACK;
y->color=BLACK;
z=z->parent->parent;// z->color == RED
}
else
{
if(z==z->parent->left)
{
z=z->parent;
rbtree_right_rotate(T,z);
}
z->parent->color=BLACK;
z->parent->parent->color=RED;
rbtree_left_rotate(T,z->parent->parent);
}
}
}
T->root->color=BLACK;
}
void rbtree_insert(RedBlackTree *T,rbtree_node *z)
{
rbtree_node* pre=T->nil;
rbtree_node* cur=T->root;
while(cur!=T->nil)
{
pre=cur;
if(z->key>cur->key)
cur=cur->right;
else if(z->key<cur->key)
cur=cur->left;
else
return;
}
z->parent=pre;
if(pre==T->nil)
{
T->root=z;
}
else
{
if(pre->key>z->key)
pre->left=z;
else
pre->right=z;
}
z->left=T->nil;
z->right=T->nil;
z->color=RED;
rbtree_insert_fixup(T,z);
}
/**********************红黑树删除 start***************************/
rbtree_node *rbtree_mini(RedBlackTree *T, rbtree_node *x) {
while (x->left != T->nil) {
x = x->left;
}
return x;
}
rbtree_node *rbtree_maxi(RedBlackTree *T, rbtree_node *x) {
while (x->right != T->nil) {
x = x->right;
}
return x;
}
rbtree_node *rbtree_successor(RedBlackTree *T, rbtree_node *x)
{
rbtree_node *y = x->parent;
if (x->right != T->nil)
{
return rbtree_mini(T, x->right);
}
while ((y != T->nil) && (x == y->right)) {
x = y;
y = y->parent;
}
return y;
}
//调整
void rbtree_delete_fixup(RedBlackTree *T, rbtree_node *x) {
while ((x != T->root) && (x->color == BLACK)) {
if (x == x->parent->left) {
rbtree_node *w = x->parent->right;
if (w->color == RED) {
w->color = BLACK;
x->parent->color = RED;
rbtree_left_rotate(T, x->parent);
w = x->parent->right;
}
if ((w->left->color == BLACK) && (w->right->color == BLACK)) {
w->color = RED;
x = x->parent;
}
else {
if (w->right->color == BLACK) {
w->left->color = BLACK;
w->color = RED;
rbtree_right_rotate(T, w);
w = x->parent->right;
}
w->color = x->parent->color;
x->parent->color = BLACK;
w->right->color = BLACK;
rbtree_left_rotate(T, x->parent);
x = T->root;
}
}
else {
rbtree_node *w = x->parent->left;
if (w->color == RED) {
w->color = BLACK;
x->parent->color = RED;
rbtree_right_rotate(T, x->parent);
w = x->parent->left;
}
if ((w->left->color == BLACK) && (w->right->color == BLACK)) {
w->color = RED;
x = x->parent;
}
else {
if (w->left->color == BLACK) {
w->right->color = BLACK;
w->color = RED;
rbtree_left_rotate(T, w);
w = x->parent->left;
}
w->color = x->parent->color;
x->parent->color = BLACK;
w->left->color = BLACK;
rbtree_right_rotate(T, x->parent);
x = T->root;
}
}
}
x->color = BLACK;
}
rbtree_node *rbtree_delete(RedBlackTree *T, rbtree_node *z)
{
rbtree_node *y = T->nil;
rbtree_node *x = T->nil;
if ((z->left == T->nil) || (z->right == T->nil))
{
y = z;
}
else
{
y=rbtree_successor(T, z);
}
if (y->left != T->nil)
x = y->left;
else if (y->right != T->nil)
x = y->right;
x->parent = y->parent;
if (y->parent == T->nil)
T->root = x;
else if (y == y->parent->left)
y->parent->left = x;
else
y->parent->right = x;
if (y != z)
{
z->key = y->key;
z->value = y->value;
}
// 调整
if (y->color == BLACK) {
rbtree_delete_fixup(T, x);
}
return y;
}
/**********************红黑树删除 end***************************/
/**********************红黑树查找 start***************************/
rbtree_node *rbtree_search(RedBlackTree *T, KEY_TYPE key) {
rbtree_node *node = T->root;
while (node != T->nil) {
if (key < node->key) {
node = node->left;
}
else if (key > node->key) {
node = node->right;
}
else {
return node;
}
}
return T->nil;
}
/**********************红黑树查找 end***************************/
憧憬
目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。
- 坚持每周至少两篇以上,把专栏好好整理一遍。
- 运营好自己的博客,涨粉到万级,帮助更多的人,认识更多志同道合的有分享精神的朋友。
- 推出技术视频,让分享更容易被理解。