标题: SQL Server 安装程序失败。怎么解决。

标题: SQL Server 安装程序失败。怎么解决。,第1张

这种情况通常是系统数据库文件损坏造成的重复现象,我们可以运用命令行指令修复,再安装相应的程序。

解决方法:

1、在键盘上使用“WIN+X”打开系统菜单,选择“命令提示符(管理员)”,打开命令提示符。

2、进入CMD命令模式窗口后,写入“sfc /scannow”, 按下回车键开始扫描。

3、开始系统扫描,此过程将需要一段时间。开始系统扫描的验证阶段。验证 已完成。这个过程慢慢等待,不要关闭命令窗口。

4、当扫描全部完成时会提示windows资源保护找到了损坏文件并成功修复了它们。CBs.Log windir /Logs/CBs/CBs.log中有详细信息就表示扫描和修复 *** 作都已经完成,可以正常关闭CMD命令窗口。

扩展资料:

SFC——SystemFileChecker“系统文件检查程序(器)”,它是一个相当与还原的一个命令,SFC是一个DOS时期就有的命令。用于检查是否有已损坏或被取代的系统档案,然后提示您取代原始Windows系统文件不相符的任何文件。

#include<iostream>

#include<map>

using namespace std

const int N=15e3+100

struct node{

int v//结点值

int l,r//左右孩子的下标

st()

{//初始化

l=r=-1

}

}tree[4*N]//4倍空间,用来储存二叉树

map<int,int>mp//储存数值在数组a中的下标

int a[N]//基础数组,数组tree在其基础上建树

int n=1//1 5 8 0 0 0 6 0 0

void build_tree(int rt,int &num)

{//构建二叉树

if(a[num]==0)

{//a[num]==0,表示空结点

tree[rt].v=-1

}

else

{

if(mp.count(a[num])==0)

mp[a[num]]=rt//储存a[num]在树中的位置

tree[rt].v=a[num]//结点赋值

num++

build_tree(2*rt,num)//左孩子

num++

build_tree(2*rt+1,num)//右孩子

}

}

/*

1 5 8 0 0 0 6 0 0

3

8 1 6

*/

int main()

{

int x=1,m=0

do

{

cin>>a[n++]//储存结点值

}

while(getchar()!='\n')//回车结束输入

build_tree(1,x)//构建二叉树(结构体数组模拟)

cin>>m//查询次数

for(int i=0i<mi++)

{

int num,y

cin>>num//查询值

y=mp[num]//mp[num]是num在tree数组中的位置,查询效率O(log2n)

y/=2//左右孩子的下标除以2,就是父节点的下标

if(y==0)

{//父节点下标为0,既是根节点

cout<<0<<endl

}

else

{//输出父节点值

cout<<tree[y].v<<endl

}

}

return 0

}

二叉查找树就是一颗二叉树,他的左节点比父节点要小,右节点比父节点要大。他的高度决定的查找效率。

当查找BST时,先进行当前节点比较:

直到当前节点指针为空或找到节点,查找结束。

插入BST时,先查找要插入的父节点。找到父节点后,通过比较与父节点的大小,决定要插入节点的位置。

BST存在的问题是,数在插入的时候会导致倾斜,不同的插入顺序会导致数的高度不一样,而树的高度直接影响了树的查找效率。理想的高度是LogN,最坏的情况所有的节点都在一条斜线上,这样树的高度为N。

基于BST存在的问题,平衡查找二叉树(Balanced BST)产生了。平衡树的插入和删除的时候,会通过旋转 *** 作将高度保持在LogN。其中两款具有代表性的平衡术分别为AVL树和红黑树。AVL树由于实现比较复杂,而且插入和删除性能差,在实际环境下的应用不如红黑树。

红黑树的实际应用非常广泛,如Java中的HashMap和TreeSet,Java 8中HashMap的实现因为用RBTree代替链表(链表长度>8时),性能有所提升。

1.任何一个节点都有颜色,红色或黑色

2.根节点是黑色的

3.父子节点之间不能出现两个连续的红节点

4.任何一个根节点,遍历到他的子孙节点,所经过的黑色节点数必须相同

5.空节点被认为是黑色的

因为以上规则的限制,保证了红黑树的自平衡。红黑树从根到叶子节点的最长路径不会超过最短路径的2倍。

当插入或删除节点时,红黑树的规则可能被打破,这时候就需要做出一些调整,来维持RBT的规则定义。调整包括变色,左旋转和右旋转。

为了符合红黑树规则,尝试将节点颜色红色节点变为黑色,或将黑色节点变为红色。

旋转 *** 作(Rotate)的目的是使节点颜色符合定义,让RBTree的高度达到平衡。

左旋转:被旋转的节点从左侧上升到父节点

右旋转:被旋转的节点从右侧上升到父节点

查了一些资料,插入和删除包含了很多情况,比较复杂。这里有个传送们:

30张图带你彻底理解红黑树 。

RBTree与BST的插入方式是一样的,只不过在插入之后,可能会导致树的不平衡,这时需要对树进行旋转 *** 作和颜色修复(这里简称插入修复),使得他符合RBTree的定义。

新插入的节点颜色是红色,插入修复 *** 作如果遇到父节点为黑色则修复 *** 作结束。也就是说,只有在父节点为红色时是需要修复 *** 作的。

当父节点为红色时,插入修复 *** 作分以下三种情况:

如果叔叔节点也为红色,则将父节点,叔叔节点,祖父节点颜色互换,这样就符合了RBTree的定义。既维持了高度的平衡。下图中插入N节点,经过修复A、B、C节点颜色互换,如果A节点的父节点也为红色,则继续进行修复 *** 作。

现将C节点左旋,旋转后就将修复 *** 作转换为 case 2。

插入 *** 作是一个向根节点回溯的 *** 作,一旦牵涉的所有节点都符合红黑树的规则,则修复 *** 作结束。之所以回回溯,是因为在进行case 1时,会将父节点颜色改变,有可能导致祖父节点不平衡,这时候就需要从祖父节点为起点,根据以上三种case做出调整。调整会一直到节点符合红黑树规则维泽,否则会一直到root节点结束,root节点永远是黑色的。

删除 *** 作首先要做的是BST的删除 *** 作,如果被删除的节点是叶子节点,则直接删除,如果是非叶子节点,会将该节点的中序遍历后继节点顶替要删除的节点。删除后就需要做删除修复 *** 作,使RBTree符合定义,高度平衡。

删除修复 *** 作在遇到删除节点是红色或到达root节点时结束修复。

删除 *** 作是针对删除节点是黑色才有的(4. 任何一个根节点,遍历到他的子孙节点,经过的黑色节点必须相同),需要做的 *** 作是从他的兄弟节点上借调黑色节点过来,如果没有黑色节点可以调用,则向上追溯,将每一级的黑色节点减1(??),使红黑树符合定义。

删除 *** 作的总体思想是从兄弟节点借调黑色节点使树保持局部平衡,如果局部平衡达成了,就看整体树是否平衡,如果不平衡就向上追溯调整。

删除修复节点分为有多种情况,下面举两种例子:

...

由于兄弟节点是红色的,无法从兄弟节点借调,所以将兄弟节点通过左旋提升到父节点。这样case 1就可以转换成 case 2 ,case 3,case 4进行处理了。

红黑树的删除是最复杂的 *** 作,复杂在于删除黑色节点的时候,如何从兄弟节点调用,以保证树符合定义。

作为二叉查找树中面众多的实现之一,红黑树通过引入颜色的概念,通过颜色约束的使用,包括变色和旋转,来保持树的高度平衡。即使在最坏的情况下, *** 作的时间复杂度也为O(LogN),原因是整个红黑树的高度保持是LogN(因为旋转修复)。

参考文章:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8128452.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存