随想录好词 好词
范文大全 > 好词 > :随想录好词是由小学生作文网为您精心收集,如果觉得好,请把这篇文章复制到您的博客或告诉您的朋友,以下是随想录好词的正文:
第一篇:《随想录(用好红黑树)》
随想录(用好红黑树)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
红黑树作为一种特殊类型的二叉树,在软件中有很多的用处。但是在网络上面,讲解红黑树的文章和博客很多,可是真正找一份可以信赖的、方便使用的红黑树代码却不多。本篇文章的目的就是介绍如何正确使用红麻雀怎么抓黑树的代码。
本篇文章的红黑树代码主要来自linux kernel 2.6.7,其中实现文件保存在ib/rbtree.c,而头文件保存在
include/linux/rbtree.h。当前的linux代码已经升级到3.0以上了,但是关于红黑树的代码内容却没有什么大的改变,这说明关于红黑树的代码是非常稳定的。
(1)红黑树的来源
a)双向链表是二叉树的最初来源,虽然二叉树也可以做到基本有序,但是查找起来十分麻烦
b)在双向链表的基础上,人们发明了二叉树,二叉树保证了数据可以像数组一样快速完成二分查找,极大地提高了查找效率
c)二叉树存在各个数据查找效率不一致的情况,为了做到数据查找效率一致,人们设计了二叉平衡树,左子树和右子树的高度绝对值之差要小于1
d)为了减少子树旋转的次数,人们设计了红黑树,进一步提高了数据插入和删除的效率
(2)红黑树的概念
a)红黑树的每个节点必须是红色或者是黑色
b)根节点到叶节点之间的路径不存在连续的红色节点
c)根节点到叶节点之间的黑色节点数相同
(3)红黑树的基本结构定义
[cpp]
1.
2.
3.
4.
5.
6.
7.
8.
9. #ifndef _RBTREE_H #define _RBTREE_H #include <stdio.h> struct rb_node { struct rb_node *rb_parent; int rb_color;
10. #define RB_RED 0
11. #define RB_BLACK 1
12. struct rb_node *rb_right;
13. struct rb_node *rb_left;
14. };
15.
16. struct rb_root
17. {
18. struct rb_node *rb_node;
19. };
20.
21. #define RB_ROOT { NULL }
22. #define rb_entry(ptr, type, member) \
23. ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) 24.
25. extern void rb_insert_color(struct rb_node *, struct rb_root *);
26. extern void rb_erase(struct rb_node *, struct rb_root *);
27.
28. /* Find logical next and previous nodes in a tree */
29. extern struct rb_node *rb_next(struct rb_node *);
30. extern struct rb_node *rb_prev(struct rb_node *);
31. extern struct rb_node *rb_first(struct rb_root *);随想录好词
32.
33. /* Fast replacement of a single node without remove/rebalance/add/rebalance */
关于沙漠的唯美句子34. extern void rb_replace_node(struct rb_node *victim, struct rb_node *new,
35. struct rb_root *root);
36.
37. static void rb_link_node(struct rb_node * node, struct rb_node * parent,
38. struct rb_node ** rb_link)
39. {
40. node->rb_parent = parent;
41. node->rb_color = RB_RED;
42. node->rb_left = node->rb_right = NULL;
43.
44. *rb_link = node;
45. }
46.
47. #endif /* _RBTREE_H */
(4) 红黑树的实现
a) 完成内容
1、调整插入节点rb_node的颜色
2、在rb_root中删除指定rb_node
3、获取首节点
4、获取上一个节点
5、获取下一个节点
6、替换节点随想录好词
b)实现源代码
[cpp]
1.
2.
3.
4.
5.
6.
7.
8.
9. #include "rbtree.h" static void __rb_rotate_left(struct rb_node *node, struct rb_root *root) { struct rb_node *right = node->rb_right; if ((node->rb_right = right->rb_left)) right->rb_left->rb_parent = node; right->rb_left = node;
10.
11. if ((right->rb_parent = node->rb_parent))
12. {
13. if (node == node->rb_parent->rb_left)
14. node->rb_parent->rb_left = right;
15. else
16. node->rb_parent->rb_right = right;
17. }
18. else
19. root->rb_node = right;
20. node->rb_parent = right;
21. }
22.
23. static void __rb_rotate_right(struct rb_node *node, struct rb_root *root)
24. {
25. struct rb_node *left = node->rb_left;
26.
27. if ((node->rb_left = left->rb_right))
28. left->rb_right->rb_parent = node;
29. left->rb_right = node;
30.
31. if ((left->rb_parent = node->rb_parent))
32. {
33. if (node == node->rb_parent->rb_right)
34. node->rb_parent->rb_right = left;
35. else
36. node->rb_parent->rb_left = left;
37. }
38. else
39. root->rb_node = left;
40. node->rb_parent = left;
41. }
42.
43. void rb_insert_color(struct rb_node *node, struct rb_root *root)
44. {随想录好词
45. struct rb_node *parent, *gparent;
46.
47. while ((parent = node->rb_parent) && parent->rb_color == RB_RED)
48. {
49. gparent = parent->rb_parent;
50.
51. if (parent == gparent->rb_left)
52. {
53. {
54. register struct rb_node *uncle = gparent->rb_right;
55. if (uncle && uncle->rb_color == RB_RED)
56. {
57. uncle->rb_color = RB_BLACK;
58. parent->rb_color = RB_BLACK;
59. gparent->rb_color = RB_RED;
60. node = gparent;
61. continue;
62. }
63. }
64.
65. if (parent->rb_right == node)
66. {
67. register struct rb_node *tmp;
68. __rb_rotate_left(parent, root);
69. tmp = parent;
70. parent = node;
71. node = tmp;
72. }
73.
74. parent->rb_color = RB_BLACK;
75. gparent->rb_color = RB_RED;
76. __rb_rotate_right(gparent, root);
77. } else {
78. {
79. register struct rb_node *uncle = gparent->rb_left;
80. if (uncle && uncle->rb_color == RB_RED)
81. {
82. uncle->rb_color = RB_BLACK;
83. parent->rb_color = RB_BLACK;
84. gparent->rb_color = RB_RED;
赞美祖国的作文85. node = gparent;
86. continue;
87. }
88. }
89.
90. if (parent->rb_left == node)
91. {
92. register struct rb_node *tmp;
93. __rb_rotate_right(parent, root);
94. tmp = parent;
95. parent = node;
96. node = tmp;
97. }
98.
99. parent->rb_color = RB_BLACK;
100. gparent->rb_color = RB_RED;
101. __rb_rotate_left(gparent, root);
102. }
103. }
104.
105. root->rb_node->rb_color = RB_BLACK;
106. }
107.
108. static void __rb_erase_color(struct rb_node *node, struct rb_node *parent, 109. struct rb_root *root)
110. {
111. struct rb_node *other;
112.
113. while ((!node || node->rb_color == RB_BLACK) && node != root->rb_node) 114. {
115. if (parent->rb_left == node)
116. {
117. other = parent->rb_right;
118. if (other->rb_color == RB_RED)
119. {
120. other->rb_color = RB_BLACK;
121. parent->rb_color = RB_RED;
122. __rb_rotate_left(parent, root);
123. other = parent->rb_right;
124. }
125. if ((!other->rb_left ||
126. other->rb_left->rb_color == RB_BLACK)
127. && (!other->rb_right ||
128. other->rb_right->rb_color == RB_BLACK))
129. {
130. other->rb_color = RB_RED;
131. node = parent;
132. parent = node->rb_parent;
第二篇:《代码质量随想录(六)——用心写好注释》
代码质量随想录(六)用心写好注释
作者: 爱飞翔 发布时间: 2012-06-20 22:49
我要先说说对待注释的态度问题。有一种不写注释的理由,叫做“代码是最好的注释”或是“好的代码应该是自解释型的”。这两个观点其实我都非常赞同,只不过,它们容易被人误用为不写注释的藉口。我们有理由质疑,那种胡乱拼凑瞎写出来的代码能当作“最好的注释”来用吗?即便是非常注重质量的代码,也可能会有程序本身所传达不尽的意思,这个时候,需要些微的注释来提点一下。其实这种心态和随意涂鸦式的注释风格所存在的毛病是一样的,就是靠“不写注释”或者“狂写注释”来回避、掩盖领域模型的缺陷,以及测试用例的不完备。随想录好词
所以我标题中的“用心”就是这个意思,用正确的心态去写注释,须知注释能够发挥作用的前提是对领域模型有着正确的理解,以及对产品代码有着合适的测试覆盖度。在满足这两个前提的情况下,我们才会用注释来提升代码的可读性。否则,就是“宽严皆误”:如果没满足刚说的那两个前提,你写注释,就是掩盖错误;不写,就是逃避错误,实质是一样的。如果你发现注释不好写,写着不顺,你别怪注释,多半是业务模型或测试本身先出了问题。 上一篇文章主要讲的是注释的重要性,这一篇则来谈谈注释的具体写作技巧。标题中所谓“写好”注释,除了能够通过注释来阐明代码的未尽之意,还有就是要让注释充当我们打磨领域模型与提升测试覆盖度的催化剂。有的时候我们先写了一定量的注释,然后在代码审查中发现可以由此来找出业务逻辑中存在的问题,从而完善标识符的命名,同时删减原有注释(ARC作者没有太强调这一点,我下面的例子补充了一些自己的看法)。这样一来,它在很多场合,其实是提高代码质量的一种中间过程和手段。
ARC一书的作者总结说,好的注释就是要“精准”(precise)和“简洁“(compact),也就是有高的“信息/空间比”(information-to-space ratio)。通俗一点说,就是注释要写得言简义赅、微言大义,尽量用最少的文句精准地表达代码意图。
1.尽量减少注释所用的词语,同时考虑以更加精准的名称来取代注释。
比如:
// int表示CategoryType。
// 内部数值对的第一个浮点数是“分数”,
// 第二个是“重量”。
typedef hash_map<int, pair<float, float> > ScoreMap;
上一段代码的注释太长了,不如直接以映射关系来解释它:
// CategoryType -> (score, weight)
typedef hash_map<int, pair<float, float> > ScoreMap;
ARC的作者觉得修改之后的注释将3行减少至1行,很合适。不过我却觉得,做到这一步并没有结束,既然写出了“CategoryType -> (score, weight)”这个映射关系,那么是不是应该考虑将“(score, weight)”这个数值对封装起来呢?如果不是在程序级别进行封装,那么至少应该在语义上进行封装,比如,如果它表示一个重量查询表,那么,ScoreMap这个变量就应该命名为CategoryToWeightQueryTable或TypeToScoreWeightPair。
如果从业务领域的角度看,前者好,毕竟根据Score来查Weight,应该是业务模型的一部分,该模型应该在某个类或包的总结说明处深入阐释过了,不需要再重复解释了,提一下WeightQueryTable这个领域模型的名字,就足够了。但如果从直白度看,则后者好。如果这段代码没有对领域进行深入建模,那么类似后者这种“傻瓜式”的表达则是减少阅读难度所必须的命名技巧。
小翔以上提出的两种命名方法,虽然长了一些,但是该说的却都说了,而且省去了维护注释的麻烦。所以我说,“精简注释”与“琢磨命名”之间,并不矛盾,而且针对前者所做的努力,往往会激发后者。有些时候,我们精简了注释之后,发现可以用精准的命名来取代精简之后的注释;还有些时候,我们则发现,导致注释啰嗦,无法精简的根源,其实在于命名不当。或者更深入地看,有些情况下七夕作文是由于对领域模型的不瞭解或者分析错误所致。通过“精简注释“这个工作流程,我们可以求得更好的命名,也可以厘清对领域模型的误解,所以我说,“精简注释“这一步,其实可以看作编写高质量代码的催化剂。
2.减少有歧义的表述方式。
例如:
// 将数据插入缓存,但要先检查它是否过大。
到底是检查谁的大小
随想录好词由小学生作文网收集整理,转载请注明出处!
上一页 1 2 下一页