红黑树算法源码:
一、左旋代码分析:
/*-----------------------------------------------------------
|   node           right
|   / \    ==>     / \
|   a  right     node  y
|       / \       / \    
|       b  y     a   b    //左旋
-----------------------------------------------------------*/
static rb_node_t* rb_rotate_left(rb_node_t* node, rb_node_t* root)      //传入根节点和node(要旋转的节点)
{
rb_node_t* right = node->right;                                        //指定指针指向 right == node->right

if ((node->right = right->left))                                      //使node的右孩子变为b        
{
right->left->parent = node; 
}
right->left = node;                                                 //使node成为right的左孩子

if ((right->parent = node->parent))                                    //使right继承node的父母
{
if (node == node->parent->right)                                //如果node是父母的右孩子,就让right继承右孩子
{
node->parent->right = right;
}
else                                                            //反之,继承左孩子        
{
node->parent->left = right;
}
}
else                                                                //如果node没有父母(他是根节点),就让right继承根节点    
{
root = right;
}
node->parent = right;                                                //最后right成为node的父母

return root;
}

二、右旋代码分析:
/*-----------------------------------------------------------
|       node            left
|       / \             / \
|    left  y   ==>    a    node
|   / \                    / \
|  a   b                  b   y  //右旋与左旋差不多,分析略过
-----------------------------------------------------------*/
static rb_node_t* rb_rotate_right(rb_node_t* node, rb_node_t* root)                //传入根节点和node(要旋转的节点)
{
rb_node_t* left = node->left;                                                 //保存传入节点的左节点,准备进行右旋转

if ((node->left = left->right))                                                //使b覆盖left的位置,与node完成双向指向(原left == b)
{
left->right->parent = node;                                            
}
left->right = node;                                                            //将left的右节点换成node    

if ((left->parent = node->parent))                                             //将left的父亲换成node的父亲
{
if (node == node->parent->right)                                           //判断node属于原父亲的哪一边节点,将left移到相应位置
{
node->parent->right = left;
}
else
{
node->parent->left = left;
}
}
else                                                                           //如果node为根节点,没有父亲,此时将根节点赋为left
{
root = left;
}
node->parent = left;                                                           //将node的父亲换为left,完成旋转   

return root;
}

三、红黑树查找结点代码:
//----------------------------------------------------
//rb_search_auxiliary:查找
//rb_node_t* rb_search:返回找到的结点
//----------------------------------------------------
static rb_node_t* rb_search_auxiliary(key_t key, rb_node_t* root, rb_node_t** save)            //传入要查找的值,根节点,如果找不到就保存与传入的值最相近的值
{
rb_node_t *node = root, *parent = NULL;
int ret;

while (node)                             //从根节点开始,判断节点是否为空,依次向下查找
{
parent = node;
ret = node->key - key;                //判断要查找的之属不属于这个节点
if (0 < ret)
{
node = node->left;                //如果节点的值大于查找的值,则选择左子树继续进行遍历
}
else if (0 > ret)                     //如果节点的值小于查找的值,则选择右子树继续进行遍历
{
node = node->right;
}
else
{
return node;                    //等于0时,返回这个节点
}
}

if (save)                                //当查找的数值找不到时,save用来保存与要查找的节点最近的位置(用来插入)
{
*save = parent;
}

return NULL;                            //找不到,返回空
}

//返回上述rb_search_auxiliary查找结果
rb_node_t* rb_search(key_t key, rb_node_t* root)
{
return rb_search_auxiliary(key, root, NULL);        //只用来查找,不需要返回从哪里插入  
}

四、红黑树插入的代码:
//---------------------------------------------------------
//红黑树的插入结点
rb_node_t* rb_insert(key_t key, data_t data, rb_node_t* root)                //传入节点的值,节点包含的数据,以及根节点
{
rb_node_t *parent = NULL, *node;                                        //parent用来保存插入的地方,node代表节点空间(用来分配)

parent = NULL;
if ((node = rb_search_auxiliary(key, root, &parent)))                    //调用rb_search_auxiliary找到插入结点的地方  //为一个指针赋值为NULL的等式(判断为假)
{
return root;
}

node = rb_new_node(key, data);  //分配结点
node->parent = parent;   
node->left = node->right = NULL;
node->color = RED;

if (parent)                                    //判断插入的节点处于parent的哪个位置(左,右)
{
if (parent->key > key)
{
parent->left = node;
}
else
{
parent->right = node;
}
}
else                                         //根节点为空时,将node设置成根节点
{
root = node;
}

return rb_insert_rebalance(node, root);       //插入结点后,调用rb_insert_rebalance修复红黑树的性质
}

五、针对红黑树插入的三种情况的修复工作:
//红插入的3种情况黑树修复
//为了在下面的注释中表示方便,也为了让下述代码与我的倆篇文章相对应,
//用z表示当前结点,p[z]表示父母、p[p[z]]表示祖父、y表示叔叔。
//--------------------------------------------------------------
static rb_node_t* rb_insert_rebalance(rb_node_t *node, rb_node_t *root)
{
rb_node_t *parent, *gparent, *uncle, *tmp;                      //父母p[z]、祖父p[p[z]]、叔叔y、临时结点*tmp

while ((parent = node->parent) && parent->color == RED)         //parent 为node的父母,且当父母的颜色为红时
{
gparent = parent->parent;                                   //gparent为祖父

if (parent == gparent->left)                                //当父母是祖父的左孩子时。

{
uncle = gparent->right;                                  //定义叔叔的概念,叔叔y就是父母的右孩子。

            if (uncle && uncle->color == RED)                 //情况1:z的叔叔y是红色的,z的父母为红色,父母为祖父母的左孩子,叔叔为右孩子
{
uncle->color = BLACK;                               //将叔叔结点y着为黑色
parent->color = BLACK;                              //z的父母p[z]也着为黑色。解决z,p[z]都是红色的问题。
gparent->color = RED;  
node = gparent;                                     //将祖父当做新增结点z,指针z上移俩层,且着为红色。(进行后续的判断)
}
else                                             //情况2:z的叔叔y是黑色的,z的父母为红色,同时z为父母的右节点
{   
if (parent->right == node)                          //且z为右孩子
{
root = rb_rotate_left(parent, root);             //左旋[结点z,与父母结点]
tmp = parent;                                    //parent与node 互换角色
parent = node;
node = tmp;    
}
//情况3:z的叔叔y是黑色的,z的父母为红色,此时z成为了左孩子。
parent->color = BLACK;                               //z的父母p[z]着为黑色
gparent->color = RED;                               //原祖父结点着为红色
root = rb_rotate_right(gparent, root);                //右旋[结点z,与祖父结点]
}

else 
{                                                     //祖父的右孩子作为父母的节点
uncle = gparent->left;                          //祖父的左孩子作为叔叔结点。[原理还是与上部分一样的]
if (uncle && uncle->color == RED)                  //情况1:z的叔叔y是红色的,父母的颜色为红
{
uncle->color = BLACK;
parent->color = BLACK;
gparent->color = RED;
node = gparent;                               //同上。
}
else                                               
{
if (parent->left == node)                     //情况2:z的叔叔y是黑色的,父母的颜色为红,且z为父母左孩子
{
root = rb_rotate_right(parent, root);     //以结点parent、root右旋
tmp = parent;
parent = node;
node = tmp;                               //parent与node 互换角色

//情况3,z的叔叔y是黑色的,父母的颜色为红,且z为父母右孩子
parent->color = BLACK;
gparent->color = RED;
root = rb_rotate_left(gparent, root);       //以结点gparent和root左旋
}
}
}

root->color = BLACK;                                     //根结点,不论怎样,都得置为黑色。
return root;                                              //返回根结点。
}

六、红黑树的删除:
//------------------------------------------------------------
//红黑树的删除结点
rb_node_t* rb_erase(key_t key, rb_node_t *root)
{
rb_node_t *child, *parent, *old, *left, *node;            //child:用来替代要删除的那个节点 的节点  的儿子,最终作为平衡函数的参数
//parent:1.中间变量:用来将节点间的指向导正  2.作为平衡函数的参数:最终变换后的child的父亲节点
//old:保存要删除的那个节点,最后用来释放  left:中间变量  用来寻找 能替代即将删除的节点 的节点
//node:用来替代要删除的那个节点 的节点
color_t color;                                            //1.用来替代要删除的那个节点 的节点的颜色(在删除的节点左右子树不为空的情况下)
//2.删除节点的颜色(此时是删除的节点有一边为空)
if (!(node = rb_search_auxiliary(key, root, NULL)))      //调用rb_search_auxiliary查找要删除的结点
{
printf("key %d is not exist!\n");
return root;
}

old = node;                                            //保存node节点,此时node为最上层操作节点

if (node->left && node->right)                        //当node的左右孩子不为空时,进行判断
{
node = node->right;                                //使node等于他的右孩子    
while ((left = node->left) != NULL)                //对他的右孩子的左孩子依次遍历,直至为空       //取到左孩子为空的一个节点
{
node = left;                                //目的:取到能充当 要删除的节点的位置   的节点(原理:取到的节点比右子树的值小,比左子树的值大)
}
child = node->right;                            //将   替代要删除的那个节点 的节点  对应的右孩子取到
parent = node->parent;                            //将   替代要删除的那个节点 的节点  对应的父节点取到
color = node->color;                            //将   替代要删除的那个节点 的节点  对应的颜色取到,如果颜色为黑色的话,替代完后则会因为缺少黑色
//而破坏平衡
if (child)                                        //如果节点对应的右孩子不为空的话,将右孩子(child)划分到父亲(node的parent)的指向
{
child->parent = parent;
}
if (parent)                                        //判断node属于父亲的哪一边节点,让孩子(child)继承父亲(node)这边的节点(此时parent指向child)
{
if (parent->left == node)
{
parent->left = child;
}
else
{
parent->right = child;
}
}
else                                            //貌似有错误,此时parent一定会有值。可能情况,并发parent已经删除
{
root = child;
}

if (node->parent == old)                        //如果node一开始左孩子就为空,此时将parent下移(因为此时parent是即将删除的那个节点,需要移动)
{
parent = node;
}

node->parent = old->parent;                        //此时node位于old子树下最小的一个节点,让node覆盖old(要删除的节点)的位置(因为一直寻找的是old的右子树)
node->color = old->color;
node->right = old->right;
node->left = old->left;

if (old->parent)                                //使node继承  old的父亲  的指向
{
if (old->parent->left == old)
{
old->parent->left = node;
}
else
{
old->parent->right = node;
}

else                                            //如果要删除的是根节点,则让node充当根节点
{
root = node;
}

old->left->parent = node;                        //使node继承  old左子树  的父亲

if (old->right)                                    //使node继承  old右子树  的父亲
{
old->right->parent = node;
}
}                                                    //此种情况原理:使要删除的节点  中的右子树  中的最小值 覆盖删除的节点的位置(原因:此值比他左子树任意值都大,
else                                                //比右子树任意值都小)。
{
if (!node->left)                                //此情况原理:如果要删除的节点  的左右儿子  有一方为空,那就让删除的节点的父亲指向 要删除的节点的儿子 ,
{                                                //完成删除。
child = node->right;
}
else if (!node->right)
{
child = node->left;
}
parent = node->parent;
color = node->color;                            //将删除节点的颜色取到,如果为黑的话,路径则会因为缺少黑色而造成不平衡

if (child)
{
child->parent = parent;
}
if (parent)
{
if (parent->left == node)
{
parent->left = child;
}
else
{
parent->right = child;
}
}
else                                            //如果删除的是根节点,就让他的儿子充当根节点
{
root = child;
}
}

free(old);                                            //释放删除节点的空间

if (color == BLACK)                                    //如果删除的那个节点的颜色为黑色,会破坏平衡,需要进行自平衡
{
root = rb_erase_rebalance(child, parent, root); //调用rb_erase_rebalance来恢复红黑树性质,从变动过的最下端进行平衡(child和parent的位置)
}

return root;
}
七、红黑树删除四种情况的修复工作:
//----------------------------------------------------------------
//红黑树修复删除的4种情况
//为了表示下述注释的方便,也为了让下述代码与我的倆篇文章相对应,
//x表示要删除的结点(用x替代了曾经要删除的节点,转换成了删除x),*other 表示兄弟结点 //x(表示曾经删除的node的位置,现在的child),w(表示other节点,child的兄弟节点)
//----------------------------------------------------------------
static rb_node_t* rb_erase_rebalance(rb_node_t *node, rb_node_t *parent, rb_node_t *root)
{
rb_node_t *other, *o_left, *o_right;                                   //传进来的node节点(child)的兄弟*other,兄弟左孩子*o_left,*o_right

while ((!node || node->color == BLACK) && node != root)             //当child为黑时(child为叶子节点(NULL为黑),或者它的颜色为黑),并且child不为根节点
{
if (parent->left == node)                                        //当child是他父亲的左节点时
{
other = parent->right;                                        //other为child的兄弟节点,也是曾经 node(这里指x)的兄弟节点

//因为删除了parent左子树的一个黑色节点,所以不平衡

if (other->color == RED)                                       //情况1:x(child)的兄弟w(other)是红色的
{                                                            //此时parent的颜色只能是黑色,进行如下变换
other->color = BLACK;                                      
parent->color = RED;                                           //改变颜色,w(other)变为黑、parent变为红。
root = rb_rotate_left(parent, root);                          //再对parent做一次左旋
other = parent->right;                                      //x(child)的新兄弟other变成了parent的右儿子,曾经的other是现在parent的父节点。
}
if ((!other->left || other->left->color == BLACK) &&
(!other->right || other->right->color == BLACK))  
//情况2:x(child)的兄弟w(other)是黑色,且w(other)的俩个孩子也都是黑色的

            {                                                                 //由于w(other)和w(other)的俩个孩子都是黑色的,则在x和w上得去掉一黑色,
other->color = RED;                                           //于是,兄弟w(other)变为红色。

//此时parent下已经达成平衡
//(但为了防止parent 和 w(other)同为红色进行一下操作(猜测会继续进行判断:类似递归))

                node = parent;                                               //此时将 node 和parent 全部上移
parent = node->parent;  
}
else                                                       

if (!other->right || other->right->color == BLACK)        //情况3:x(child)的兄弟w(other)是黑色的,右儿子为黑色或者空(NULL为黑),左儿子肯定为红
{
if ((o_left = other->left))                               //w(other)和其左孩子o_left,颜色交换。
{
o_left->color = BLACK;                                //w(other)的左孩子变为黑色

other->color = RED;                                       //w(other)变成红色
root = rb_rotate_right(other, root);                      //再对w(other)进行右旋,此处是为了防止w(other)和parent同为红色。
other = parent->right;                                    //变化后的,父结点的右孩子,作为新的兄弟结点w(other)。
}
//情况4:x的兄弟w(other)是黑色的,右儿子为红,左儿子为黑,此种情况和变换后的情况3相同


//下面是对情况3和4的平衡算法,可直接完成平衡(无需再进行递归)
other->color = parent->color;                                  //把兄弟节点染成当前节点父节点的颜色。
parent->color = BLACK;                                      //把当前节点父节点染成黑色
if (other->right)                                              //因为w(other)右孩子是红
{
other->right->color = BLACK;                              //兄弟节点w(other)右孩子染成黑色
}
root = rb_rotate_left(parent, root);                          //并再做一次左旋
node = root;                                                   //此时这两种情况完成平衡,直接返回根节点;
break;
}
}
//下述情况与上述情况,原理一致。分析略。

else                                                            //此种情况x(child)在是他父亲的右节点
//(此时相当于删除的那个节点与替换的那个节点)是父子关系,才会导致child成为右节点
{
other = parent->left;
if (other->color == RED)                                    //情况1:x(child)的兄弟w(other)是红色的
{                                                                //此时parent的颜色只能是黑色,进行如下变换
other->color = BLACK;                                        //改变颜色,w(other)变为黑、parent变为红。
parent->color = RED;
root = rb_rotate_right(parent, root);                        //再对parent做一次右旋
other = parent->left;                                        //在重新定位w(other)的位置
}
if ((!other->left || other->left->color == BLACK) &&        //情况2:x(child)的兄弟w(other)是黑色,且w(other)的俩个孩子也都是黑色的
(!other->right || other->right->color == BLACK))            //由于w(other)和w(other)的俩个孩子都是黑色的,则在x和w上得去掉一黑色,
{
other->color = RED;                                            //于是,兄弟w(other)变为红色。
node = parent;                                                //此时parent下已经达成平衡
parent = node->parent;                                        //(但为了防止parent 和 w(other)同为红色进行一下操作(猜测会继续进行判断:类似递归))
}                                                                //此时将 node 和parent 全部上移

else
{
if (!other->left || other->left->color == BLACK)        //同上,省略。
{
if ((o_right = other->right))
{
o_right->color = BLACK;
}
other->color = RED;
root = rb_rotate_left(other, root);
other = parent->left;
}
other->color = parent->color;
parent->color = BLACK;
if (other->left)
{
other->left->color = BLACK;
}
root = rb_rotate_right(parent, root);
node = root;
break;
}
}
}

if (node)                                                                //当child为红色时,直接将它改为黑色,就可以完成平衡
{
node->color = BLACK;                                                  //最后将node[上述步骤置为了根结点],改为黑色。
}  
return root;  //返回root
}


八、测试用例
//主函数
int main()
{
int i, count = 100;
key_t key;
rb_node_t* root = NULL, *node = NULL;

srand(time(NULL));                                                        //srand((unsigned)time(NULL))则使用系统定时/计数器的值作为随机种子
for (i = 1; i < count; ++i)
{
key = rand() % count;                                                //rand函数是随机数生成器,第一次调用rand()之前没有调用srand(),
//那么系统会自动调用srand(),使用同种子相同的数调用 rand()会导致相同的随机数序列被生成
if ((root = rb_insert(key, i, root)))
{
printf("[i = %d] insert key %d success!\n", i, key);
}
else
{
printf("[i = %d] insert key %d error!\n", i, key);
exit(-1);
}

if ((node = rb_search(key, root)))
{
printf("[i = %d] search key %d success!\n", i, key);
}
else
{
printf("[i = %d] search key %d error!\n", i, key);
exit(-1);
}
if (!(i % 10))
{
if ((root = rb_erase(key, root)))
{
printf("[i = %d] erase key %d success\n", i, key);
}
else
{
printf("[i = %d] erase key %d error\n", i, key);
}
}
}

return 0;
}

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Oracle11g安装打怪升级之路

    #!/bin/bash # -*- coding: UTF-8 -*- # Filename: oracle_install.sh # Description: Install the oracle database configuration document on the Linux system # 脚本内容根据自己经常安装整理,可以正常安装,有感兴趣的小伙伴可以试试练练手,或许你缺的不是天赋,而是敢…...

    2024/4/24 10:59:47
  2. typescript学习总结

    TypeScript学习总结 《TypeScript 入门教程》 基础 原始数据类型 1,原始数据类型有6中null,undefined,string,number,boolean,symbol(es6) let a: string = hello world; let c: number = 1 let b: boolean = false; let u: undefined = undefined; let n: null = null…...

    2024/4/24 10:59:49
  3. 第2阶段 第16讲 JSP核心技术(下)

    课程回顾 JSP的概念 JSP执行流程 JSP和Servlet的关系 区别: Servlet三件事: ①获取数据②调用业务方法③流程控制, JSP侧重数据的展示。 联系: JSP就是Servlet,JSP继承HttpServlet。 EL表达式 ${ } 可以访问作用域的数据 综合案例 九大内置对象 什么是内置对象 内置对象是JS…...

    2024/4/28 2:34:34
  4. 七天学会h5和css3之盒子模型内边距和外边距(12)

    先来练习一个题目:做一个新浪体育文本页面。,可能你现在并不能很好的做出这个效果,但是学习了本节后,你将很快的做出这个页面,具体代码和效果如下:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/x…...

    2024/4/24 10:59:44
  5. 记录一下在上海AR(不方便透露)工作的这几个月

    2019年9月2日在ar入职,是家外包公司,福利一般,记得最清楚的就是中秋节的福利是靠垫,不让拿回家只能放在公司用,离职了要还给公司,丢了要赔钱,一个靠垫140多吧 当时被外派到太平洋保险做JAVA开发,项目很乱,年初做的项目,我半路去的,项目里面都是前人留下的坑,整个项…...

    2024/4/24 10:59:46
  6. 【学习0605】NVIDIA DRIVE AGX Developer Kit - How to set up

    看到这个设备,meng!找了一些资料,如下: 文档 http://www.gpus.cn/gpus_list_page_techno_support_content?id=31 https://elinux.org/Jetson_AGX_Xavier#Guides_and_Tutorials 社区 http://bbs.gpuworld.cn/ 视频 https://www.youtube.com/watch?v=FhyjhC5rD5g 图片...

    2024/4/18 21:00:32
  7. Commercial Satellite or Spy Satellite ? 令人扑朔迷离的DigitalGlobe公司WorldView卫星星座

    Commercial Satellite or Spy Satellite ? 令人扑朔迷离的DigitalGlobe公司WorldView卫星星座 说实话,写这个篇文章需要很大的勇气,光题目都苦思冥想了很久,刚开始的想法是披着“Commercial” 外衣的“Spy Satellite”,总觉得不太合适。话不多说,开始正题: 一、 起源 在第…...

    2024/4/15 5:23:28
  8. 学习笔记(32):零基础掌握 Python 入门到实战-通用积木:标准库和第三方包

    立即学习:https://edu.csdn.net/course/play/26676/339588?utm_source=blogtoedunumpy nppandas pdpip install package_namerequests...

    2024/4/27 23:54:31
  9. 算法之隔离病毒

    病毒扩散得很快,现在你的任务是尽可能地通过安装防火墙来隔离病毒。 假设世界由二维矩阵组成,0 表示该区域未感染病毒,而 1 表示该区域已感染病毒。可以在任意 2 个四方向相邻单元之间的共享边界上安装一个防火墙(并且只有一个防火墙)。 每天晚上,病毒会从被感染区域向相…...

    2024/4/15 5:23:26
  10. 百度大脑OCR助力机动车查验系统 省时又提效!

    百度大脑OCR助力机动车查验系统 省时又提效!云顺通科技通过整合百度大脑多项OCR技术,成功搭建机动车查验预受理登记系统,使得群众从预约到完成业务办理实现了:一次受理、一次排队、一窗办结!案例客户云顺通科技,广东云顺通科技信息有限公司是集软件开发,信息系统集成服务…...

    2024/4/28 0:35:09
  11. 极视角「智慧城市管理系统」:实现高效一体化的城市精细化管理 |百万人学AI评选

    2020 无疑是特殊的一年,而 AI 在开年的这场”战疫“中表现出了惊人的力量。站在“新十年”的起点上,CSDN【百万人学AI】评选活动正式启动。本届评选活动在前两届的基础上再度升级,设立了「AI优秀案例奖Top 30」、「AI新锐公司奖Top 10」、「AI开源贡献奖Top 5」三大奖项。我…...

    2024/4/15 5:23:24
  12. 学习笔记(01):JavaSE常见面试题解析-简述Java语言中8种基本数据类型以及所占字节长度...

    立即学习:https://edu.csdn.net/course/play/24813/286354?utm_source=blogtoedu...

    2024/4/26 21:46:03
  13. 学习笔记(48):R语言入门基础-修改值

    立即学习:https://edu.csdn.net/course/play/24913/285720?utm_source=blogtoedu修改值...

    2024/4/27 23:49:42
  14. 嵌入式串口打印信息重定向到当前终端界面

    文章目录原文Linux中重定向 原文 https://blog.csdn.net/wuquan_1230/article/details/105782687 在嵌入式Linux系统中,有时通过远程(telnet或者ssh)登录到现场设备,想看程序的实时打印的调试信息,需要将输出到串口的调试信息重定向到当前登录的终端界面上。 也可以将程序…...

    2024/4/24 10:59:42
  15. 利用FATFS读取CSV指定数据

    ** 利用FATFS读取.csv指定行数据 **第一次写博客,没有什么经验,如有问题,可随时接受指正,最近项目上遇到一个读取CSV文件指定位置的问题,网上找了资源也没有发现合适的方案。所以分享下自己的经验。 文件打开 f_open 函数原型:FRESULT f_open(FILE fp,const TCHAR path,B…...

    2024/4/24 10:59:42
  16. 【Dlib人脸特征提取】1. 检测人脸特征点

    【 1. 人脸特征点含义 】 在我们检测到人脸区域之后,接下来要研究的问题是获取到不同的脸部的特征,以区分不同人脸,即人脸特征检测(facial feature detection)。它也被称为人脸特征点检测(facial landmark detection)。人脸特征点通常会标识出脸部的下列数个区域:右眼眉毛(…...

    2024/4/24 10:59:40
  17. 实验1-6 输出带框文字 (5分)

    本题要求编写程序,输出指定的带框文字。 输入格式: 本题无输入 输出格式: 按照下列格式输出带框文字。 ************Welcome ************解析:略代码: #include <stdio.h> int main() {printf("************\n"" Welcome\n""***********…...

    2024/4/24 10:59:40
  18. sevlet的生命周期解析

    第一种方式:1.当客户端浏览器第一次请求服务器端的servlet时servlet被创建(初始化)并且只调用一次servlet的init()方法初始化参数。2.然后根据客户端浏览器具体的请求方式(doGet,doPost)取调用servlet中的service方法并且根据不同的请求方式进行调用具体的doGet和dopost方法…...

    2024/4/24 10:59:39
  19. Java中 递归 个人小分享

    Java中 递归 个人小分享 计算1-100自然数的和 public int getSum(int n) { if(n == 1) { System.out.println(n + “one”); return 1; }else { System.out.println(n); return n + getSum(n -1); 分析: n = 3 : 走else return 3 + getsum(2) getsum(2)> 走else return 2 …...

    2024/4/24 10:59:44
  20. MySql.Data.MySqlClient.MySqlException:“Unable to connect to any of the specified MySQL hosts.”

    MySql.Data.MySqlClient.MySqlException:“Unable to connect to any of the specified MySQL hosts.” optionsBuilder.UseMySQL(“server=**...;port=3307;database=wordpresstea;user=;password=*&;Character Set=utf8;”); 链接字符串加 端口号加port...

    2024/4/24 10:59:40

最新文章

  1. 设计模式学习笔记 - 开源实战四(下):总结Spring中用到的11种设计模式

    概述 上篇文章&#xff0c;讲解了 Spring 中支持扩展功能的两种设计模式&#xff1a;观察者模式和模板模式。这两种模式帮助我们创建扩展点&#xff0c;让框架的使用者在不修改源码的情况下&#xff0c;基于扩展点定制化框架功能。 实际上&#xff0c;Spring 框架中用到的设计…...

    2024/4/28 7:32:10
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 自我介绍的HTML 页面(入门)

    一.前情提要 1.主要是代码示例&#xff0c;具体内容需自己填充 2.代码后是详解 二.代码实例和解析 代码 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>自我介绍页面</title>…...

    2024/4/26 14:55:53
  4. MySQL之存储引擎,详细总结

    在介绍存储引擎之前我们先了解了解MySQL的体系结构&#xff1a; 连接层 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限 服务层 第二层架构主要完成大多数的核心…...

    2024/4/26 2:09:28
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57