Writen by Fox(yulefox.at.gmail.com)
在具体讨Z前,本文先厘清UUIDQUniversally Unique IDentifierQ与GUIDQGlobally Unique IDentifierQ的关系?/p>
在分布式、网l、单机环境下Qؓ了能够用具有某UŞ式的ID唯一标识pȝ中的M元素Q这LID可以不依赖中心认证自动生成,于是UUIDp生了?/p>
UUID标准的历史沿革和具体实现?a title="RFC4122" target="_blank">RFC 4122?a title="ITU-T rec. x.667" target="_blank">ITU-T Rec. X.667?a title="ISO/IEC 9834-8:2008" target="_blank">ISO/IEC 9834-8:2008中均有详l描q。ITU和ISO采用的标准和RFC 4122都是在UUID的早期版本基上完成,各版本之间具有一致性和兼容性?/p>
因ؓ不能保证UUID的唯一性,ITU和ISO针对UUID的用都?a id="eac3" title="免责声明" target="_blank">免责声明?/p>
GUID一般是指Microsoft对于UUID标准的实玎ͼUUID的实现则多见于其他系l(*NIX、MAC OS{)中。在了解了这一区别后,本文统一使用UUID来指代对应的原理、算法及实现?/p>
文中关于UUID的讨论全部基于RFC 4122和ITU-T Rec. X.667以及OSF、IETF、ITUQT、ISO、FIPS的各U标准文。而UUID的细节(如结构、表C、算法、实现等Q均以ITU-T Rec. X667为唯一蓝本Q文?#8220;本标?#8221;x代该蓝本?/p>
o 介绍
UUID是长度ؓ16-byteQ?28-bitQ的IDQ一般以形如f81d4fae-7dec-11d0-a765-00a0c91e6bf6的字W串作ؓURNQUniform Resource NameQ统一资源名称Q?/p>
o 动机
无须中心认证Q自动生成,支持一台机器每U生?0Mơ(100U秒U,光含原因是指能够区分的最时间单位ؓ100nsQ将旉作ؓ因子Ӟq箋生成两个UUID的时间至要间隔100nsQ。方便存取、分配、排序、查找?/p>
o l构
76543210765432107654321076543210
+ – - – = – - – = – - – = – - – +
15 | TimeLow | 12
11 | TimeMid | Version.. | 8
7 |Vari.. |Clock..| Node | 4
3 | Node | 0
+ – - – = – - – = – - – = – - – +
15 – 12: TimeLow 旉值的低位
11 – 10: TimeMid 旉值的中位
09 – 08: VersionAndTimeHigh 4位版本号和时间值的高位
07: VariantAndClockSeqHigh 2位变体(ITU-TQ和旉序列高位
06: ClockSeqLow 旉序列低位
05 – 00: Node l点
hexOctet = hexDigit hexDigit
hexDigit =
“0″ / “1″ / “2″ / “3″ / “4″ / “5″ / “6″ / “7″ / “8″ / “9″ /
“a” / “b” / “c” / “d” / “e” / “f” /
“A” / “B” / “C” / “D” / “E” / “F”
UUID =
TimeLow
“-” TimeMid
“-” VersionAndTimeHigh
“-” VariantAndClockSeqHigh ClockSeqLow
“-” Node
UUID׃q?个域构成Q每个域~码q字节,q以16q制数表C128位的UUIDQ相d以减?#8220;-”分隔 QVariantAndClockSeqHigh和ClockSeqLow对应的两个字节例外,如上所C)。该l构中包含版本(VersionQ、变? QVariantQ、时_TimeQ、时钟序列(Clock SequenceQ、节点(NoteQ信息(以无W号整型DC)?/p>
o 合法?/strong>
除判断variant位设|是否正、基于时间生成的UUID旉值是否ؓ未经分配的将来时间外Q实际应用中没有其他机制可以判定UUID是否合法?/p>
o 变体
Variant位是UUIDW?字节QVariantAndClockSeqHighQ的最?位,
7 6 5 Description
0 – – NCS向后兼容
1 0 – 本标?br> 1 1 0 Microsoft向后兼容
1 1 1 ITU-T Rec. X.667保留
o 版本
UUID的生成有旉、名U、随机数三种{略Q以W?字节QVersionAndTimeHighQ的最?位表C?/p>
目前UUID定义?个版本:
7 6 5 4 Ver Description
0 0 0 1 1 Z旉的版本(本标准)
0 0 0 0 2 使用嵌入式POSIXQDCE安全版本Q?br> 0 0 1 1 3 使用MD5哈希的基于名U的版本Q本标准Q?br> 0 1 0 0 4 Z随机数的版本Q本标准Q?br> 0 1 0 1 5 使用SHA-1的基于名U的版本Q本标准Q?/p>
o 旉
旉是一?0位的整型|?位版本号外的?字节Q,对应UTCQ格林尼L?582q?0?5日午夜始Q的100ns旉间隔计数?/p>
对于ver 4?Q该值分别对应一个随机数和一个全局唯一的名U?/p>
o 旉序列
对基于时间的UUID版本Q时间序列用于避免因旉向后讄或节点值改变可能造成的UUID重复Q对Z名称或随机数的版本同h用:目的都是Z防止UUID重复?/p>
如果前一旉序列已知Q通过自增实现旉序列值的改变Q否则,通过密码学(伪)随机数设|新的时钟序列倹{?/p>
o 节点
对基于时间的UUID版本Q节点由48位的单播MAC地址构成。对于没有MAC地址的系l,节点gؓ一个密码学Q伪Q随机数Qؓ防止与MAC地址发生撞Q需讄多播位)?/p>
o 定UTC旉Q?0?TimeQ和旉序列|14?ClockSequenceQ;
o 讄TimeLowQ对应Time?1-0位)Q?/p>
o 讄TimeMidQ对应Time?7-32位)Q?/p>
o 讄VersionAndTimeHighQ?位版本号及Time?9-48位)Q?/p>
o 讄VariantAndClockSeqHighQ变体位及对应ClockSequence?3-8位)Q?/p>
o 讄ClockSeqLowQ对应ClockSequence?-0位)Q?/p>
o 讄NodeQ对?8位MAC地址Q?/p>
o Z名称的UUID生成法
o 针对相应的命名空_如DNS、URL、OID{)分配一个UUID作ؓ所有UUID的命名空间标识;
o 名U{换ؓ字节数列Q?/p>
o 使用MD5或SHA-1法对与名称兌的命名空间标识进行计,产生16字节哈希l果Q?/p>
o 讄TimeLowQ对应哈希值的3-0字节Q;
o 讄TimeMidQ对应哈希值的5-4字节Q;
o 讄VersionAndTimeHighQ对应哈希值的7-6字节Q,以相应版本号重写对应位(W?字节的高4位)Q?/p>
o 讄VariantAndClockSeqHighQ对应哈希值的W?字节Q,重写变体对应位(W?字节的高2位,本标准对应gؓ10Q;
o 讄ClockSeqLowQ对应哈希值的W?字节Q;
o 讄NodeQ对应哈希值的15-10字节Q?/p>
? 于MD5撞问题QMD5只用于向后兼容的UUID生成Q不再被推荐使用。由于SHA-1哈希l果?60位(20字节Q,本算法中Q需要将FIPS PUB 180-2中的SHA-1法的哈希值字节顺序反转(字节内顺序不变)QUUID使用?5-0字节Q?9-16字节被丢弃?/p>
o Z随机数的UUID生成法
o 讄VariantAndClockSeqHigh的变体位gؓ10Q?/p>
o 讄VersionAndTimeHigh?位版本号Q?/p>
o 讄剩余位ؓ随机倹{?/p>
本文中讨论的密码学随机数Q主要根据系l可以提供的信息Q内存、硬盘、句柄、程序运行的U程、进E、句柄、堆栈等Q,利用SHA-1{哈希算法得到?/p>
其他关于密码学随机数的描qͼ我曾?a id="dtto" title="h密码学意义的PRNGQCSPRNGQ? target="_blank">q篇文章中简单提到?/p>
之前曄三次写过Fibonacci?/strong>Q?007q?月的我的Fibonacci数列Q?007q?2月的也说说数求?1+2+3…N)和其?/a>Q?008q?月的动态规划算?/a>Q但l出的都不是非常优的法?/p> 上次回去把同学借的《编E之》偷q来q没怎么看,晚上M一下,看到有讲Fibonacci?/strong>Q想hKnuth的The Art of Computer Programming Vol.1也讲q,觉得有必要对Fibonacci?/strong>做个了断?/p> 诚如Knuth在The Art of Computer Programming Vol.1所qͼFibonacci是中世纪以来Ƨ洲最伟大的数学家Q他关于al-Khwarizmi的研I催生了法QalgorithmQ一词?/p> 看到q些Q我又激动了Q数学之,不正是美在这些地方吗Q我们不是要做数学家Q但qƈ不妨我们站在门口向里张望…?/strong>
]]>
q篇文章的术语实在是太多了,所以我在文中加入了量注释Q一律以_斜?/strong>注明?/p>
本文的不之处将随时修正QMIT的?a target="_blank">Introduction to Algorithms》第15章是专门讲动态规划的?/p>
_____________________________________________________________
在数学与计算机科学领域,动态规?/strong>用于解决那些可分解ؓ重复子问?/a>Qoverlapping subproblemsQ?em>x递归求阶乘吧Qƈh最优子l构Qoptimal substructureQ?strong>x最短\径算?/em>Q(如下所qͼ的问题,动态规划比通常法p更少旉?
上世U?0q代Q?a target="_blank">Richard Bellman最早用动态规划这一概念表述通过遍历L最优决{解问题的求解过E?953q_Richard Bellman动态规?a target="_blank">赋予C意义Q该领域被IEEEU_pȝ分析和工E中。ؓU念Bellman的A献,动态规划的核心方程被命名ؓ贝尔曼方E?/a>Q该方程?a target="_blank">递归形式重申了一个优化问题?
在“动态规划”(dynamic programmingQ一词中Qprogramming与“计机~程”(computer programmingQ中的programmingq无兌Q而是来自?a target="_blank">数学规划”(mathematical programmingQ,也称优化。因此,规划是指对生成活动的优化{略。D个例子,~制一场展览的日程可称划?在此意义上,规划意味着扑ֈ一个可行的zd计划?
? 使用最优子l构L最短\径:直线表示边,波状U表CZ点间的最短\径(路径中其他节Ҏ昄Q;_线表示从v点到l点的最短\径?
不难看出Qstart到goal的最短\径由start的相邻节点到goal的最短\径及start到其盔R节点的成本决定?/em>
最优子l构卛_用来L整个问题最优解的子问题的最优解。D例来_L?/a>上某点到终点的最短\?/a>Q可先计该点所有相邻顶点至l点的最短\径,然后以此来选择最x体\径,?strong>?所C? 一般而言Q最优子l构通过如下三个步骤解决问题Q? a) 问题分解成较小的子问题Q? b) 通过递归使用q三个步骤求出子问题的最优解Q? c) 使用q些最优解构造初始问题的最优解? 子问题的求解是通过不断划分为更的子问题实现的Q直x们可以在常数旉内求解? ? Fibonacci序列的子问题C意图:使用有向无环?/a>QDAG, directed acyclic graphQ而非?/a>表示重复子问题的分解? Z么是DAG而不是树呢?{案是Q如果是树的话,会有很多重复计算Q下面有相关的解释?/em> 一个问题可划分为重复子问题是指通过相同的子问题可以解决不同的较大问题。例如,在Fibonacci序列中,F3 = F1 + F2和F4 = F2 + F3都包含计F2。由于计F5需要计F3和F4Q一个比较笨的计F5的方法可能会重复计算F2两次甚至两次以上。这一点对所有重复子问题都适用Q愚蠢的做法可能会ؓ重复计算已经解决的最优子问题的解而浪Ҏ间? 为避免重复计,可将已经得到的子问题的解保存hQ当我们要解决相同的子问题时Q重用即可。该Ҏx谓的~存QmemoizationQ而不是存储memorizationQ虽然这个词亦适合Q?strong>姑且q么叫吧Q这个单词太隄译了Q简直就是可意会不可a传,其意义是没计过则计,计算q则保存Q。当我们信不会再需要某一解时Q可以将其抛弃,以节省空间。在某些情况下,我们甚至可以提前计算出那些将来会用到的子问题的解? L而言Q动态规划利用: 1) 重复子问?/a> 2) 最优子l构 3) ~存 动态规划通常采用以下两种方式中的一U两个办法: 自顶向下Q将问题划分q子问题Q求解这些子问题q保存结果以免重复计。该Ҏ递归和缓存结合在一赗? 自下而上Q先行求解所有可能用到的子问题,然后用其构造更大问题的解。该Ҏ在节省堆栈空间和减少函数调用数量上略有优势,但有时想扑ևl定问题的所有子问题q不那么直观? Z提高按名传?/a>Qcall-by-nameQ这一机制?a target="_blank">按需传?/a>call-by-need相关Q?strong>复习一下参C递的各种规则吧,单说一下,按名传递允许改变实参?/em>Q的效率Q一些编E语a函数的q回值“自动”缓存在函数的特定参数集合中。一些语a这一Ҏ尽可能化(?a target="_blank">Scheme?a target="_blank">Common Lisp 1. Fibonacci序列 LFibonacci序列中第n个数Q基于其数学定义的直接实玎ͼ function fib(n) 如果我们调用fib(5)Q将产生一对于同一值重复计多ơ的调用树: 特别是,fib(2)计算?ơ。在更大规模的例子中Q还有更多fib的D重复计算Q将消耗指数旉? 现在Q假设我们有一个简单的映射QmapQ对?em>mQؓ每一个计过的fib及其q回值徏立映,修改上面的函数fibQ用ƈ不断更新m。新的函数将只需O(n)的时_而非指数旉Q? var m := map(0 ?1, 1 ?1) q一保存已计出的数值的技术即被称?a target="_blank">~存
if n = 0
return 0
else if n = 1
return 1
return fib(n-1) + fib(n-2)
function fib(n)
if map m does not contain key n
m[n] := fib(n-1) + fib(n-2)
return m[n]
?strong>自下而上的方法中Q我们先计算较小的fibQ然后基于其计算更大的fib。这U方法也只花费线性(O(n)Q时_因ؓ它包含一?em>n-1ơ的循环。然而,q一Ҏ只需要常敎ͼO(1)Q的I间Q相反,自顶向下的方法则需要O(n)的空间来储存映射关系?
function fib(n)
var previousFib := 0, currentFib := 1
if n = 0
return 0
else if n = 1
return 1
repeat n-1 times
var newFib := previousFib + currentFib
previousFib := currentFib
currentFib := newFib
return currentFib
在这两个例子Q我们都只计fib(2)一ơ,然后用它来计fib(3)和fib(4)Q而不是每ơ都重新计算?
2. 一U^衡的0-1矩阵
考虑n*n矩阵的赋值问题:只能??Q?em>n为偶敎ͼ使每一行和列均?em>n/2??em>n/2?。例如,?em>n=4Ӟ两种可能的方案是Q?
+ - - - - + + - - - - +
| 0 1 0 1 | | 0 0 1 1 |
| 1 0 1 0 | | 0 0 1 1 |
| 0 1 0 1 | | 1 1 0 0 |
| 1 0 1 0 | | 1 1 0 0 |
+ - - - - + + - - - - +
问:对于l定nQ共有多种不同的赋值方案?
臛_有三U可能的法来解册一问题Q?a target="_blank">ID?/a>Qbrute forceQ?a target="_blank">回溯?/a>QbacktrackingQ及动态规划(dynamic programmingQ。穷举法列D所有赋值方案,q一扑և满q条g的方案。由于共有C(n, n/2)^nU方案(在一行中Q含n/2?及n/2?的组合数为C(n,n/2)Q相当于从n个位|中选取n/2个位|置0Q剩下的自然?Q,?em>n=6ӞID法就已经几乎不可行了。回溯法先将矩阵中部分元素置??Q然后检查每一行和列中未被赋值的元素q赋|使其满每一行和列中0?的数量均?em>n/2。回溯法比穷举法更加巧妙一些,但仍需遍历所有解才能定解的数目Q可以看刎ͼ?em>n=8Ӟ该题解的数目已经高达116963796250。动态规划则无需遍历所有解便可定解的数目Q?strong>意思是划分子问题后Q可有效避免若干子问题的重复计算Q?
通过动态规划求解该问题Z意料的简单。考虑每一行恰?em>n/2??em>n/2??em>k*n(1<=k<=n)的子矩阵Q函数fҎ每一行的可能的赋值映ؓ一个向量,每个向量?em>n个整数对构成。向量每一列对应的一个整数对中的两个整数分别表示该列上该行以下已l放|的0?的数量。该问题卌{化ؓLf((n/2,n/2),(n/2,n/2),...,(n/2,n/2))Q具?em>n个参数或者说是一个含n个元素的向量Q的倹{其子问题的构造过E如下:
1) 最上面一行(Wk?/em>Q具有C(n, n/2)U赋|
2) Ҏ最上面一行中每一列的赋值情况(??Q,其对应整数对中相应的元素值减1Q?
3) 如果M整数对中的Q一元素Q则该赋值非法,不能成ؓ正确解;
4) 否则Q完成对k*n的子矩阵中最上面一行的赋|?em>k=k-1Q计剩余的(k-1)*n的子矩阵的赋|
5) 基本情况是一?*n的细的子问题,此时Q该子问题的解的数量??Q取决于其向量是否是n/2?0, 1)?em>n/2?1, 0)的排列?
例如Q在上面l出的两U方案中Q向量序列ؓQ?
((2, 2) (2, 2) (2, 2) (2, 2)) ((2, 2) (2, 2) (2, 2) (2, 2)) k = 4
0 1 0 1 0 0 1 1
((1, 2) (2, 1) (1, 2) (2, 1)) ((1, 2) (1, 2) (2, 1) (2, 1)) k = 3
1 0 1 0 0 0 1 1
((1, 1) (1, 1) (1, 1) (1, 1)) ((0, 2) (0, 2) (2, 0) (2, 0)) k = 2
0 1 0 1 1 1 0 0
((0, 1) (1, 0) (0, 1) (1, 0)) ((0, 1) (0, 1) (1, 0) (1, 0)) k = 1
1 0 1 0 1 1 0 0
((0, 0) (0, 0) (0, 0) (0, 0)) ((0, 0) (0, 0), (0, 0) (0, 0))
动态规划在此的意义在于避免了相同f的重复计,更进一步的Q上面着色的两个fQ虽然对应向量不同,但f的值是相同的,xZ么吧:D?/em>
该问题解的数量(序列a058527在OEISQ是1, 2, 90, 297200, 116963796250, 6736218287430460752, ...
下面的外部链接中包含回溯法的Perl源代码实玎ͼ以及动态规划法的MAPLE和C语言的实现?
3. 盘
考虑n*n的棋盘及成本函数C(i,j)Q该函数q回Ҏ(i,j)相关的成本。以5*5的棋盘ؓ例:
5 | 6 7 4 7 8
4 | 7 6 1 1 4
3 | 3 5 7 8 2
2 | 2 6 7 0 2
1 | 7 3 5 6 1
- + - - - - -
| 1 2 3 4 5
可以看到QC(1,3)=5
从棋盘的MҎ的第一Ӟ卌Q开始,L到达最后一阶的最短\径(使所有经q的Ҏ的成本之和最)Q假定只允许向左对角、右对角或垂直移动一根{?
5 |
4 |
3 |
2 | x x x
1 | o
- + - - - - -
| 1 2 3 4 5
该问题展CZ最优子l构。即整个问题的全局解依赖于子问题的解。定义函数q(i,j)QoQq(i,j)表示到达Ҏ(i,j)的最低成本?
如果我们可以求出W?em>n阶所有方格的q(i,j)|取其最值ƈ逆向该\径即可得到最短\径?
记q(i,j)为方?i,j)臛_下三个方|(i-1,j-1)?i-1,j)?i-1,j+1)Q最低成本与c(i,j)之和Q例如:
5 |
4 | A
3 | B C D
2 |
1 |
- + - - - - -
| 1 2 3 4 5
q(A) = min(q(B),q(C),q(D)) + c(A)
定义q(i,j)的一般Ş式:
|- inf. j<1 or j>n
q(i,j) = -+- c(i,j) i=1
|- min(q(i-1,j-1),q(i-1,j),q(i-1,j+1))+c(i,j) otherwise.
方程的第一行是Z保证递归可以退出(处理边界时只需调用一ơ递归函数Q。第二行是第一阶的取|作ؓ计算的v炏V第三行的递归是算法的重要l成部分Q与例子A?em>B?em>C?em>DcM。从该定义我们可以直接给q(i,j)的简单的递归代码。在下面的伪代码中,n表示盘的维敎ͼC(i,j)是成本函敎ͼmin()q回一l数的最|
function minCost(i, j)
if j < 1 or j > n
return infinity
else if i = 1
return c(i,j)
else
return min(minCost(i-1,j-1),minCost(i-1,j),minCost(i-1,j+1))+c(i,j)
需要指出的是,minCost只计\径成本,q不是最l的实际路径Q二者相Mq。与Fibonacci数相|׃p大量旉重复计算相同的最短\径,q一方式慢的恐怖。不q,如果采用自下而上法,使用二维数组q[i,j]代替函数minCostQ将使计过E快得多。我们ؓ什么要q样做呢Q选择保存值显然比使用函数重复计算相同路径要简单的多?
我们q需要知道实际\径。\径问题,我们可以通过另一个前Llp[i,j]解决。这个数l用于描q\径,代码如下Q?
function computeShortestPathArrays()
for x from 1 to n
q[1, x] := c(1, x)
for y from 1 to n
q[y, 0] := infinity
q[y, n + 1] := infinity
for y from 2 to n
for x from 1 to n
m := min(q[y-1, x-1], q[y-1, x], q[y-1, x+1])
q[y, x] := m + c(y, x)
if m = q[y-1, x-1]
p[y, x] := -1
else if m = q[y-1, x]
p[y, x] := 0
else
p[y, x] := 1
剩下的求最值和输出比较简单了Q?
function computeShortestPath()
computeShortestPathArrays()
minIndex := 1
min := q[n, 1]
for i from 2 to n
if q[n, i] < min
minIndex := i
min := q[n, i]
printPath(n, minIndex)
function printPath(y, x)
print(x)
print("<-")
if y = 2
print(x + p[y, x])
else
printPath(y-1, x + p[y, x])
4. 序列比对
序列比对是动态规划的一个重要应用。序列比寚w题通常是用编辑操作(替换、插入、删除一个要素等Q进行序列{换。每ơ操作对应不同成本,目标是找到编辑序列的最低成本?
可以很自然地惛_使用递归解决q个问题Q序?em>A?em>B的最优编辑通过以下措施之一实现Q?
插入B的第一个字W,?em>A?em>B的剩余序列进行最优比对;
删去A的第一个字W,?em>A?em>Bq行最优比对;
?em>B的第一个字W替?em>A的第一个字W,?em>A的剩余序列和Bq行最优比寏V?
局部比对可在矩阵中列表表示Q单?i,j)表示A[1..i]到b[1..j]最优比对的成本。单?i,j)的成本计可通过累加盔R单元的操作成本ƈ选择最优解实现。至于序列比对的不同实现法Q参?a target="_blank">Smith-Waterman?a target="_blank">Needleman-Wunsch?
对序列比对的话题q不熟悉Q更多的话也无从谈vQ有熟悉的朋友倒是可以介绍一下?/em>
1) 许多字符?/a>操作法?a target="_blank">最长公共子?/a>?a target="_blank">最镉K增子列?a target="_blank">最长公共字?/a>Q?
2) 动态规划用?a target="_blank">?/a>的树分解Q可以有效解x?a target="_blank">树宽?/a>?a target="_blank">生成?/a>{许多与囄关的法问题Q?
3) 军_是否及如何可以通过某一特定上下文无x?/a>产生l定字符串的Cocke-Younger-Kasami (CYK)法Q?
4) 计算机国际象?/a>?a target="_blank">转换?/a>?a target="_blank">x?/a>的用; 5) Viterbi法Q用?a target="_blank">隐式马尔可夫模型
6) Earley法Q一c?a target="_blank">图表分析?/a>Q;
7) Needleman-Wunsch及其?a target="_blank">生物信息?/a>中用的法Q包?a target="_blank">序列比对?a target="_blank">l构比对?a target="_blank">RNAl构预测Q?
8) Levenshtein距离Q编辑距)Q?
9) 弗洛伊d最短\?/a>法Q? 10) q锁矩阵乘法ơ序优化Q? 11) 子集求和?a target="_blank">背包问题
12) 计算两个旉序列全局距离?a target="_blank">动态时间规?/a>法Q?
13) 关系型数据库的查询优化的SelingerQ又?a target="_blank">System RQ算法;
14) 评hBh曲线?a target="_blank">De Boor法Q?
15) 用于解决板球q动中断问题?a target="_blank">Duckworth-LewisҎQ?
16) 价DP代法求解马尔可夫决策q程Q?
17) 一些图形图像边~以下的选择ҎQ如“磁铁”选择工具?a target="_blank">PhotoshopQ?
18) 间隔调度Q?
19) 自动换行Q?
20) 巡回旅行商问?/a>Q?strong>又称邮差问题或货担郎问题Q; 21) 分段最二乘法Q? 22) 音乐信息?/a>跟踪? 对于q些法应用Q大多未曾接触,甚至术语译的都有问题,鉴于本文主要在于介绍动态规划,所以仓促之中,未及查证?/em> 1) 贝尔曼方E?/a> 2) 马尔可夫决策q程 3) 贪心法 _____________________________________________________________ 关于动态规划,q只是一译文,后面根据实际问题具体写点动态规划的应用?/p>
]]>