??xml version="1.0" encoding="utf-8" standalone="yes"?>久久国产香蕉视频,亚洲精品乱码久久久久久自慰
,久久久久久亚洲AV无码专区 http://www.shnenglu.com/amazon/category/8953.htmlFight for Top Coder ?/description>zh-cn Wed, 26 Aug 2009 06:42:25 GMT Wed, 26 Aug 2009 06:42:25 GMT 60 数的整除特征【{载?/title> http://www.shnenglu.com/amazon/archive/2009/08/25/94402.htmlq风 q风 Tue, 25 Aug 2009 13:53:00 GMT http://www.shnenglu.com/amazon/archive/2009/08/25/94402.html http://www.shnenglu.com/amazon/comments/94402.html http://www.shnenglu.com/amazon/archive/2009/08/25/94402.html#Feedback 0 http://www.shnenglu.com/amazon/comments/commentRss/94402.html http://www.shnenglu.com/amazon/services/trackbacks/94402.html 原文地址Q?a >http://blog.sina.com.cn/s/blog_4effee7d0100bg35.html 什么数能被2Q?Q?Q?Q?Q?整除Q我惛_家基本上都知道的。如果是7Q?1Q?3的话Q可能知道的人就不多了。找到这个资料,发上来希望能帮助到大家。
数的整除特征
①能?整除的数的特征:个位数字?????的整?“特征”包含两方面的意义Q一斚wQ个位数字是偶数Q包?Q的整数Q必能被2整除Q另一斚wQ能?整除的数Q其个位数字只能是偶敎ͼ包括0Q?下面“特征”含义怼?/p>
②能?整除的数的特征:个位???/p>
③能?Q或9Q整除的数的特征Q各个数位数字之和能?Q或9Q整除?/p>
④能?Q或25Q整除的数的特征Q末两位数能?Q或25Q整除?/p>
例如Q?864=1800Q?4Q因?00??5的倍数Q所?800??5的倍数.又因??4Q所?864能被4整除.但因?564Q所?864不能?5整除.
⑤能?Q或125Q整除的数的特征Q末三位数能?Q或125Q整除?/p>
例如Q?9375Q?9000Q?75Q因?000??25的倍数Q所?9000??25的倍数.又因?25?75Q所?9375能被125整除.但因?375Q所?29375?/p>
⑥能?1整除的数的特征:q个整数的奇C上的数字之和与偶C上的数字之和的差Q大减小Q是11的倍数?/p>
例如Q判?23456789q九位数能否?1整除Q?/p>
解:q个数奇C上的数字之和?Q?Q?Q?Q?=25Q偶C上的数字之和?Q?Q?Q?Q?0.因ؓ25?0Q?Q又因ؓ11?Q所?1?23456789不能?/p>
再例如:判断13574是否?1的倍数Q?/p>
解:q个数的奇数位上数字之和与偶C上数字和的差是:Q?Q?Q?Q?Q?Q?Q=0.因ؓ0是Q何整数的倍数Q所?1?.因此13574?1的倍数?/p>
⑦能?Q?1?3Q整除的数的特征Q一个整数的末三位数与末三位以前的数字所l成的数之差Q以大减)能被7Q?1?3Q整除?/p>
例如Q判?059282是否?的倍数Q?/p>
解:?059282分ؓ1059?82两个?因ؓ1059-282Q?77Q又7?77Q所??059282.因此1059282?的倍数?/p>
再例如:判断3546725能否?3整除Q?/p>
解:?546725分ؓ3546?25两个?因ؓ3546-725=2821.再把2821分ؓ2?21两个敎ͼ因ؓ821?Q?19Q又13?19Q所?3?821Q进?3?546725.
数的整除性质主要有:
Q?Q如果甲数能被乙数整除,乙数能被丙数整除Q那么甲数能被丙数整除?/p>
Q?Q如果两个数都能被一个自然数整除Q那么这两个数的和与差都能被q个自然数整除?/p>
Q?Q如果一个数能分别被几个两两互质的自然数整除Q那么这个数能被q几个两两互质的自然数的乘积整除?/p>
Q?Q如果一个质数能整除两个自然数的乘积Q那么这个质数至能整除q两个自然数中的一个?/p>
Q?Q几个数怹Q如果其中一个因数能被某数整除,那么乘积也能被这个数整除?/p>
灉|q用以上整除性质Q能解决许多有关整除的问题?/p>
【例1】在□里填上适当的数字,使得七位数□7358□□能分别被9Q?5?整除?/p>
分析与解Q分别由能被9Q?5?整除的数的特征,很难推断个七位数。因?Q?5Q?两两互质Q由整除的性质Q?Q知Q七位数能被 9×25×8=1800整除Q所以七位数的个位,十位都是0Q再p?整除的数的特征,推知首位数应?。这个七位数?735800?/p>
【例2】由2000?l成的数111…11能否?1?71q两个质数整除?
分析与解Q因?1×271=11111Q所以由??l成的数11111能被41?71整除。按“11111”?000?每五位分成一节, 2000÷5=400Q就?00节,
因ؓ2000?l成的数11…11能被11111整除Q?1111能被41?71整除Q所以根据整除的性质Q?Q可知,?000?l成的数111…11能被41?71整除?/p>
【例3】现有四个数Q?6550Q?6551Q?6552Q?6554。能不能从中扑և两个敎ͼ使它们的乘积能被12整除Q?/p>
分析与解Q根据有x除的性质Q先?2分成两数之积Q?2=12×1=6×2=3×4?/p>
要从已知的四个数中找Z个,使其U能?2整除Q有以下三种情况Q?/p>
Q?Q找Z个数能被12整除Q这个数与其它三个数中的M一个的乘积都能?2整除Q?/p>
Q?Q找Z个数能被6整除Q另一个数能被2整除Q那么它们的U就能被12整除Q?/p>
Q?Q找Z个数能被4整除Q另一个数能被3整除Q那么它们的U能?2整除?/p>
Ҏ判断Q这四个数都不能?2整除Q所以第Q?Q种情况不存在?/p>
对于W(2Q种情况Q四个数中能?整除的只?6554Q?6550Q?6552是偶敎ͼ所以可以?6554?6550Q?6554?6552?/p>
对于W(3Q种情况Q四个数中只?6552能被4整除Q?6551?6554都能?整除Q所以可以?6552?6551Q?6552?6554?/p>
l合以上分析Q去掉相同的Q可知两个数的乘U能?2整除的有以下三组敎ͼ76550?6554Q?76552?6554Q?76551?7655
【例4】在所有五位数中,各位数字之和{于43且能够被11整除的数有哪些?
分析与解Q从题设的条件分析,Ҏ求五位数有两个要求:
①各C上的数字之和{于43Q?/p>
②能?1整除?/p>
因ؓ能被11整除的五位数很多Q而各C上的数字之和{于43的五位数较少Q所以应选择①ؓH破口。有两种情况Q?/p>
Q?Q五位数׃?和四?l成Q?/p>
Q?Q五位数׃?和三?l成?/p>
上面两种情况中的五位数能不能?1整除Q?Q?Q?如何摆放呢?Ҏ?1整除的数的特征,如果奇数位数字之和是27Q偶C数字之和?6Q那么差?1Q就能被11整除。满些要求的五位数是Q?97999Q?9979Q?98989?/p>
【例5】能不能从1?0的各数排成一行,使得L盔R的两个数之和都能?整除Q?/p>
分析与解Q?0个数排成一行的Ҏ很多Q逐一试验昄行不通。我们采用反证法?/p>
假设题目的要求能实现。那么由题意Q从前到后每两个Cl共?l,每组的两C和都能被3整除Q推??0的和也应能被3整除。实际上Q??0的和{于55Q不能被3整除。这个矛盾说明假设不成立Q所以题目的要求不能实现?/p>
l习
1.已知4205?813都是29的倍数Q?392?018是不?9的倍数Q?/p>
2.如果两个数的和是64Q这两个数的U可以整?875Q那么这两个数的差是多少Q?/p>
3.173□是个四位数。数学老师_“我在q个□中先后填入3个数字,所得到?3个四位数Q依ơ可以被9Q?1Q?整除?#8221;问:数学老师先后填入?个数字之和是多少Q班有多名学生Q?.能不能将??的各数排成一行,使得L盔R的两个数之和都能?整除Q?/p>
]]>判断图连?amp;求割点的法 http://www.shnenglu.com/amazon/archive/2009/08/17/93634.htmlq风 q风 Mon, 17 Aug 2009 11:24:00 GMT http://www.shnenglu.com/amazon/archive/2009/08/17/93634.html http://www.shnenglu.com/amazon/comments/93634.html http://www.shnenglu.com/amazon/archive/2009/08/17/93634.html#Feedback 0 http://www.shnenglu.com/amazon/comments/commentRss/93634.html http://www.shnenglu.com/amazon/services/trackbacks/93634.html 只有q通图中才可能有割点,不连通的图是没有割点?/span>。ȝ来说Q这两类法都离不开q查集结构和BFS先深搜烦Q具体如下:1.判断图连通的法 W一U方法基于BFSQ首先利用邻接表Q链表Ş式或者数lŞ式都可以Q存储图的信息,然后取标号值最的点u作ؓ根节点进行先深搜索,最l搜索到的节点将形成一|Q判断图是否q通,只要判断是否所有节炚w在树上即可?br>代码如下Q?br>
// graph[][]存储图信息,num[]存储每个点的邻接点数目 memset(flag, 0 , sizeof (flag)); DFS( 1 ); for (i = 1 ; i <= nodeNum; i ++ ) { if (flag[i] == false ) { printf( " 不连通\n " ); } }// DFS法 void DFS( int x) { int i; flag[x] = true ; for (i = 0 ; i < num[x]; i ++ ) { if (flag[graph[x][i]] == false ) { DFS(graph[x][i]); } } }
然而这U算法存在弊端,是需要存储所有的边信息,当边信息_多时Q存储数lgraph[][]、num[]和flag[]的开销是很大的。第二种Zq查集的Ҏ则解决了q个弊端Q关于ƈ查集的内容具体可见:http://www.shnenglu.com/amazon/archive/2009/08/15/93457.html 。对所有的边信息进行ƈ查集处理后,如果该图是连通图Q那么所有节点的根节Ҏ针都指向同一个点?br>代码如下Q?br>
a = Find(record[ 0 ]); for (j = 1 ; j < num_record; j ++ ) { if (a != Find(record[j])) { printf( " The door cannot be opened.\n " ); break ; } }
2.求割点的法 首先必须保证Q?span style="COLOR: red">所求的图是q通图Q不q通的图没有割?/span>?br>该算法依然基于BFSQ按照标号值大依ơ将图中的顶炚w去,对剩下的所有节点进行先深搜索,Ҏ搜烦子树的数目即可知道隐ȝ节点是否割点Q数目ؓ1Q非割点Q数目ؓ2以上Q割点)Qƈ可根据子树的数目知道删除该割点后q通子囄数目?br>代码如下Q?br>
jump = false ; for (i = 1 ; i <= nodeNum; i ++ ) { subnetNum = 0 ; HowMuch(i, subnetNum); if (subnetNum != 1 ) { printf( " %d是割点,删除后有%d个连通子图\n " , i, subnetNum); jump = true ; } }if (jump == false ) { printf( " 不是割点\n " ); } // DFS法 void DFS( int x) { int i; flag[x] = true ; for (i = 0 ; i < num[x]; i ++ ) { if (flag[graph[x][i]] == false ) { DFS(graph[x][i]); } } }// 判断是否割点 void HowMuch( int x, int & subnetNum) { int i; memset(flag, 0 , sizeof (flag)); flag[x] = true ; for (i = 1 ; i <= nodeNum; i ++ ) { if (flag[i] == false ) { subnetNum ++ ; DFS(i); } } }
]]> q查集学习小l?/title> http://www.shnenglu.com/amazon/archive/2009/08/15/93457.htmlq风 q风 Sat, 15 Aug 2009 14:01:00 GMT http://www.shnenglu.com/amazon/archive/2009/08/15/93457.html http://www.shnenglu.com/amazon/comments/93457.html http://www.shnenglu.com/amazon/archive/2009/08/15/93457.html#Feedback 0 http://www.shnenglu.com/amazon/comments/commentRss/93457.html http://www.shnenglu.com/amazon/services/trackbacks/93457.html q查集,思义是一U用来处理集合间合ƈ与查询的数据l构Q主要包括如下操作: Q?Q查询:查找元素所在的集合x节点?br>Q?Q合qӞ两个元素所在的集合合ƈZ个集合?br>q查集主要用于图论问题,例如判断一个图是否q通图、某两个Ҏ否在图中的同一q通子图中{。算法需要以下几个子q程Q?br>Q?Q对每一个节点u建立一个集合MakeSet(u)Q集合的元素只有u自己Q表C最开始时u与其他节Ҏ有\径?br>Q?Q给Z个代表\径的二元关系RQuQvQ,首先通过查询功能Find()分别扑ֈu和v所在集合的根节点,利用Find(a)==Find(b)判断u和v是否在同一集合中,如果不是׃用合q功能Merge(a, b)u所在的集合和v所在的集合合ƈ。重复执行该步?br>Q?Q处理完所有二元关pdQ每个集合便代表一个连通子图?br>接下来考虑选择何种数据l构实现q查集,使算法的效率更高?br> Q?Q单链表形式 同一集合中的节点串成一条链表,该链表的W一个节Ҏ谓集合的根节点,具体的节点结构如下:
typedef struct { int length; // 节点自n的?/span> node * head; // 指向表首的指?/span> node * tail; // 指向表尾的指针,只有表头节点对其赋?/span> node * next; // 指向下一节点的指?/span>} node; // Ҏ个节点徏立一个集合,需要O(1)旉 void MakeSet(node * u) { u -> head = u; u -> tail = u; u -> next = NULL; length = 1 ; } // 查询节点u所在集合的根节点,需要O(1)旉 node * Find(node * u) { return u -> head; } // u和v所在的集合合ƈQ需要O(N2)旉QN2是b所在集合链表长?/span>void Merge(node * a, node * b) { node * p; a -> head -> tail -> next = b -> head; a -> head -> tail = b -> head -> tail; // 较短的表合q到较长表上 if (a -> head -> length >= b -> head -> length) { p = b -> head; while (p != NULL) { p -> head = a -> head; p = p -> next; { a -> head -> length += b -> head -> length; } else { p = a -> head; while (p != NULL) { p -> head = b -> head; p = p -> next; { b -> head -> length += a -> head -> length; } }
Q?Q树形结?br> 利用有根树来表示集合Q每|表示一个集合,树根即集合的根节炏V?/font>
typedef struct { Node * father; // 父节Ҏ?/span> int rank; // 树深Q用于启发式合ƈ } node; // Ҏ个节点徏立一个集合,需要O(1)旉 void MakeSet(node * u) { u -> father = u; rank = 1 ; } // 查询节点u所在集合的根节点,q_需要O(logN)旉Q线性时最坏需要O(N) node * Find(node * u) { node * p; p = u; while (p -> father != p) { p = p -> father; } return p; } // u和v所在的集合合ƈQ需要O(1)旉 void Merge(node * a, node * b) { node * p1, p2; p1 = Find(a); p2 = Find(b); if (p1 -> length >= p2 -> length) { b -> father = a; if (p1 -> length == p2 -> length) a -> length += 1 ; } else if (p1 -> length < p2 -> length) { a -> father = b; } }
注意Q?br>Q?Q上q树形结构的q查集也可以使用数组+索引的Ş式实玎ͼ在这里不再重复?br>Q?Q树l构下算法的耗时主要体现在Find函数上,可以通过路径压羃q行优化。例如,在对节点1执行Finds函数Ӟ可以Z节???的父节点改ؓ节点4Q以后再对节???调用Find函数时就只需要O(1)的时间?/p>
// 查询节点u所在集合的根节点,旉复杂?***** node * Find(node * u) { node * p, q; p = u; while (p -> father != p) { p = p -> father; } while (u != p) { q = u -> father; u -> father = p; u = q; } return p; }
]]> 判断回文素数的方?/title> http://www.shnenglu.com/amazon/archive/2009/08/13/93189.htmlq风 q风 Thu, 13 Aug 2009 06:11:00 GMT http://www.shnenglu.com/amazon/archive/2009/08/13/93189.html http://www.shnenglu.com/amazon/comments/93189.html http://www.shnenglu.com/amazon/archive/2009/08/13/93189.html#Feedback 0 http://www.shnenglu.com/amazon/comments/commentRss/93189.html http://www.shnenglu.com/amazon/services/trackbacks/93189.html W一Q先判断是否素数Q再判断是否回文Q不推荐Q。如果是指定列D?到某个数范围内的回文素数Q可以考虑先用{选法Q?a href="http://www.shnenglu.com/amazon/archive/2009/06/20/88107.html">http://www.shnenglu.com/amazon/archive/2009/06/20/88107.htmlQ挑选出所有素敎ͼ然后利用{法逐个判断是否回文Q翻转法如下Q?br>
bool check( long a) { long b = 0 ,temp = a; // 用b保存逆{后的?temp保存输入的?最后用来和b比较 while (a > 0 ) { // 把a的D叛_左逐位取出,自左臛_地加到b?/span> b *= 10 ; b += a % 10 ; a /= 10 ; } return b == temp; // 若相{则q回true. }
W二Q先构造回文,再判断是否素敎ͼ推荐Q。可以先构造所有回文素敎ͼ然后Ҏ判断是否素数Q?a href="http://www.shnenglu.com/amazon/archive/2009/06/20/88107.html">http://www.shnenglu.com/amazon/archive/2009/06/20/88107.html Q。构造回文素数的Ҏ又有两种Q?br>Q?Q?br>三位回文数公式如下: for(a[0]=1;a[0]<10;a[0]+=2) for(a[1]=0;a[1]<10;a[1]++) n=101*a[0]+10*a[1]; 五位回文数公式如下: for(a[0]=1;a[0]<10;a[0]+=2) for(a[1]=0;a[1]<10;a[1]++) for(a[2]=0;a[2]<10;a[2]++) n=a[0]*10001+a[1]*1010+a[2]*100; 注意Q偶C位的回文素数必然是合敎ͼ因ؓ可以?1整除Q?1除外Q,且各位是偶数的回文素C必然是合敎ͼ因ؓ可以?整除?br>Q?Q?br>使用枚D+{的方法,例如12{后变?21Q?23{后变?2321Q务必保持奇C位,且最高位是偶数的话不必翻转即可判断ؓ合数?br>
int Make( int data) { int result; result = data; while ((data /= 10 ) != 0 ) { result = result * 10 + data % 10 ; } return result; }
]]> 判断素数的算?/title> http://www.shnenglu.com/amazon/archive/2009/06/20/88107.htmlq风 q风 Sat, 20 Jun 2009 13:04:00 GMT http://www.shnenglu.com/amazon/archive/2009/06/20/88107.html http://www.shnenglu.com/amazon/comments/88107.html http://www.shnenglu.com/amazon/archive/2009/06/20/88107.html#Feedback 0 http://www.shnenglu.com/amazon/comments/commentRss/88107.html http://www.shnenglu.com/amazon/services/trackbacks/88107.html
#include < cmath > bool IsPrime( int x) { for ( int i = 2 ; i <= ( int )sqrt( x); i ++ ) { if ((x % i) == 0 ) return false ; } return true ; }
l箋引申Q从1开始的q箋整数中哪些ؓ素数Q可以?#8220;{选法”。所?#8220;{选法”指的?#8220;埃拉托色?Eratosthenes){法”。他是古希腊的著名数学家。他采取的方法是Q在一张纸上写??00全部整数Q然后逐个判断它们是否是素敎ͼ扑և一个非素数Q就把它挖掉Q最后剩下的是素数。具体做法如下: <1> 先将1挖掉(因ؓ1不是素数)?span style="FONT-FAMILY: monospace"> <2> ?去除它后面的各个敎ͼ把能?整除的数挖掉Q即?的倍数挖掉?span style="FONT-FAMILY: monospace"> <3> ?去除它后面的各数Q把3的倍数挖掉?span style="FONT-FAMILY: monospace"> <4> 分别??…各数作ؓ除数去除q些C后的各数。这个过E一直进行到在除数后面的数已全被挖掉为止。例如找1?0的素敎ͼ要一直进行到除数?7为止Q事实上Q可以简化,如果需要找1~n范围内素数表Q只需q行到除Cؓn^2(根号n)Q取其整数即可。例如对1?0Q只需q行到将50^2作ؓ除数卛_。) 如上法可表CZؓQ?br>
#include < iostream > #include < cmath > // #include "Prime.h" int main() { int array[ 101 ]; int i, j; for (i = 2 ; i <= 100 ; i ++ ) array[i] = i; for (i = 2 ; i < ( int )sqrt( 100 ); i ++ ) { if (array[i] != 0 ) { for (j = i + 1 ; j <= 100 ; j ++ ) { if ((array[j] != 0 ) && (array[j] % array[i] == 0 )) { array[j] = 0 ; } } } } for (i = 2 ; i <= 100 ; i ++ ) { if (array[i] != 0 ) std::cout << array[i] << std::endl; } return 0 ; }
]]> Dijkstra法 http://www.shnenglu.com/amazon/archive/2008/12/12/69277.htmlq风 q风 Fri, 12 Dec 2008 07:53:00 GMT http://www.shnenglu.com/amazon/archive/2008/12/12/69277.html http://www.shnenglu.com/amazon/comments/69277.html http://www.shnenglu.com/amazon/archive/2008/12/12/69277.html#Feedback 0 http://www.shnenglu.com/amazon/comments/commentRss/69277.html http://www.shnenglu.com/amazon/services/trackbacks/69277.html 然而,虽然Dijkstra法能得出最短\径的最优解Q但׃它遍历计的节点很多Q所以效率低?br> 其算法描q如下: (1)设S为最短距d定的顶炚wQ看作红炚wQ,V-S是最短距d未确定的点集(看作蓝点集)。从源点s到终点v的最短\径简UCؓv的最短\径;s到v的最短\径长度简UCؓv的最短距,q记为SD(v)?br> (2)初始化。初始化Ӟ只有源点s的最短距L已知?SD(s)=0)Q故U点集S={s}Q蓝炚w为其他节炏V源点到个节点的最短距Mؓq接源点和各节点的边|若从源点到节点的路径不存在,则可假设该节点的最短\径是一条长度ؓ无穷大的虚拟路径?br> (3)在当前蓝炚w中选择一个最短距L的蓝点来扩充红炚wQ以保证法按\径长度递增的次序生各点的最短\径?br>PSQ?br> Ҏ按长度递增序生最短\径的思想Q当前最短距L的蓝点k的最短\径是Q?br> 源点Q红?Q红?Q?#8230;Q红点nQ蓝点k 距离为:源点到红点n最短距?+ <U点nQ蓝点k>辚w 为求解方便,讄一个向量D[0Q.n-1]Q对于每个蓝点v∈ V-SQ用D[v]记录从源点s到达v且除v外中间不l过M蓝点(若有中间点,则必为红??#8220;最?#8221;路径长度Q简UC计距)?br> 若k是蓝炚w中估计距L的点Q则k的估计距d是最短距,卌D[k] = min{D[i] i∈V-S}Q则D[k] = SD(k)?br> 初始Ӟ每个蓝点v的D[c]值应为权w<sQv>Q且从s到v的\径上没有中间点,因ؓ该\径仅含一条边<sQv>?br> (4)k扩充U点集s后,蓝点集估计距ȝ修改?br>PSQ?br> k扩充到红点后Q剩余蓝炚w的估计距d能由于增加了新红点k而减,此时必须调整相应蓝点的估计距R?br> 对于L的蓝点jQ若kp变红后D[j]变小Q则必定是由于存在一条从s到j且包含新U点k的更短\径:P=<sQ?#8230;QkQj>。且D[j]减小的新路径P只可能是׃路径<sQ?#8230;Qk>和边<kQj>l成?br> 所以,当length(P)=D[k]+w<kQj>于D[j]Ӟ应该用P的长度来修改D[j]的倹{?br> (5)当蓝炚w中仅剩下最短距Mؓ∞的蓝点,或者所有蓝点已扩充到红炚wӞs到所有顶点的最短\径就求出来了?br> 以下是Dijkstra法的伪代码Q?br>
Dijkstra(GQDQs) { // 以下是初始化操作 S = {s}; D[s] = 0 ; // 讄初始的红炚w及最短距?/span> for (all i 属于 V - S ) do // 对蓝炚w中每个顶点iQ设|i初始的估计距Mؓw<sQi> D[i] = G[s][i]; // 以下是扩充红炚w for (i = 0 ;i < n - 1 ;i ++ ) do { // 最多扩充n-1个蓝点到U点?/span> D[k] = min{D[i]Qall i V - S}Q?nbsp; // 在当前蓝炚w中选估计距L的点k if (D[k]{于∞) return Q?nbsp; // 蓝点集中所有蓝点的估计距离均ؓ∞Ӟ表示q些点的最短\径不存在?/span> S= S∪{k}Q?nbsp; // 蓝点k涂红后扩充到U点?/span> for (all j∈V - S) do // 调整剩余蓝点的估计距?/span> { if (D[j] > D[k] + G[k][j]) { // 新红点k使原D[j]值变时Q用新\径的长度修改D[j]Qjs更近?/span> D[j] = D[k] + G[k][j]Q?br> } } } }
]]>AVL树ȝ http://www.shnenglu.com/amazon/archive/2008/12/10/68915.htmlq风 q风 Wed, 10 Dec 2008 07:04:00 GMT http://www.shnenglu.com/amazon/archive/2008/12/10/68915.html http://www.shnenglu.com/amazon/comments/68915.html http://www.shnenglu.com/amazon/archive/2008/12/10/68915.html#Feedback 0 http://www.shnenglu.com/amazon/comments/commentRss/68915.html http://www.shnenglu.com/amazon/services/trackbacks/68915.html 首先lAVL树下个定义: 一AVL树或者是I树Q或者是h下列性质的二叉搜索树Q它的Q意节点的左子树和叛_树都是AVL树,且左子树和右子树的高度之差的l对g过1?br> 下面做简要分析: (1)AVL树首先是个二叉搜索树Q对L节点aQ比a数值小的节点在左子树上Q比a数值大的节点在叛_树上?br>(2)AVL树高度^衡。每个结炚w加一个数字,l出该结点右子树的高度减d子树的高度所得的高度差。这个数字即为结点的q因子balance。根据AVL树的定义QQ一l点的^衡因子只能取 -1Q??。假设有N个节点,那么光度可保持在O(log2n)Q^均搜索长度也可保持在O(log2n)?br>(3)d节点D不^衡时Q需q行q化旋转?br>q化旋转: q化旋转有两类Q?br>(1)单旋?(左旋和右? (2)双旋?(左^衡和叛_^? 每插入一个新l点ӞAVL树中相关l点的^衡状态可能会发生改变。因此,在插入一个新l点后,需要从插入位置沉K向根的路径回溯Q检查各l点的^衡因?左、右子树的高度差)?如果在某一l点发现高度不^衡,停止回溯? 从发生不q的结点vQ沿刚才回溯的\径取直接下两层的l点。此时分ZU情况: (1)如果q三个结点处于一条直U上Q则采用单旋转进行^衡化。单旋{可按其方向分为左单旋转和叛_旋{Q其中一个是另一个的镜像Q其方向与不q的Ş状相兟? (2)如果q三个结点处于一条折U上Q则采用双旋转进行^衡化。双旋{分ؓ先左后右和先叛_左两cR?br> 假设以上三个节点从上至下分别为A、B、CQ则有: (1)叛_旋{Q?br>以节点BuQ节点A时针旋转,成ؓ节点B的右儿子Q节点B原右子树成ؓ节点A的左子树?br>(2)左单旋{Q?br>以节点BuQ节点A逆时针旋转,成ؓ节点B的左儿子Q节点B原左子树成ؓ节点A的右子树?br>(3)左右双旋转: 节点C和节点B逆时针{动,C成ؓ节点A的左儿子QB成ؓC的左儿子Q且C的左子树成ؓB的右子树Q然后再q行叛_旋{?br>(4)叛_双旋转: 节点C和节点B时针{动,C成ؓ节点A的右儿子QB成ؓC的右儿子Q且C的右子树成ؓB的左子树Q然后再q行左单旋{?br>AVL树的插入 从一个空树开始,l定输入序列Q要求徏立AVL树,此时涉及到AVL树的插入问题。在插入旉要判断每个节点的q因子Qƈ在失d^衡时用到之前所说的旋{q?/p>
插入函数执行gؓx的新节点插入到AVL树的恰当位置Qƈ做^衡处理的功能?br>(1)先判断是否ؓI树Q若是则为新节点动态分配存储空_然后|success?Q再taller|ؓ1。如果不是,Ҏ新节点与根节点的大小判断Q分成左叛_树两U情况讨论,做下q操作?br>(2)法从树的根l点开始,递归向下找插入位|。在扑ֈ插入位置(I指?后,为新l点动态分配存储空_它作ؓ叶结Ҏ入,q置success?Q再taller|ؓ1Q以表明插入成功。在退出递归沿插入\径向上返回时做必要的调整Q即判断是否需要旋转^衡?br>AVL树的删除 如果被删l点x最多只有一个子奻I那么问题比较单。如果被删结点x有两个子奻I首先搜烦x 在中序次序下的直接前?y (同样可以扄接后l?。再把结点y 的内容传送给l点xQ现在问题{Ud删除l点y? 结点y从树中删厅R因为结点y最多有一个子奻I我们可以单地把y的父亲结点中原来指向y的指针改指到q个子女l点Q如果结点y没有子女Qy父亲l点的相应指针置为NULL。然后将原来以结点y为根的子树的高度?Q必Lx 通向根的路径反向q踪高度的变化对路径上各个结点的影响?br>详细内容和源代码可以参看以下链接Q?br> http://spec.cumtcs.net/%CA%FD%BE%DD%BD%E1%B9%B9(%D0%C2)/%CA%FD%BE%DD%BD%E1%B9%B9/lesson/ch07/0706.html
]]>
69Ʒþþþվ |
91Ʒ91þۺ |
ƷþþĻ |
Ʒһ߾þ |
þۺĻ |
ɫ99þþþø߳ۺӰԺ |
ձŷþþþѲ |
˾þþƷӰ |
ŷ˾þۺ |
պһþ |
þ㽶߿ۿ
|
ɫav˾þô߽ӰԺ
|
þþžžþƷ |
պƷþþվ |
þ99һ |
ھƷ˾þþþavһ |
һձ˾þۺӰ |
ҹҹþ |
þùƷǿ |
պAVþһ |
Ⱦþվȡ |
999Ʒþþþþ |
99þþƷձһ |
Ұ¾þһ |
þþƷһ |
þþƷ鶹 |
AVݺɫۺϾþ
|
þùƷһƷ |
˾þó˳ۺ222 |
þܳ |
ھƷþþþþþ |
ݺɫþþһ |
ɫۺϾþþĻ |
˾þô߽ |
þ붯aëƬ |
ɫ8ŷ˾þۺϵ |
þù |
ŷͽxxxxѿþþ |
þAVԴվ |
þþWWWѾƷ |
þҹɫ˾ƷС˵ |