多线程算法
.c_nb { border: 1px dotted rgba(153, 153, 153, 1); margin: 10px; padding: 5px }
.c_body td { border: 1px solid rgba(0, 0, 255, 1); align: center; text-align: center; font: 16px / 24px Georgia, serif }
.tt { display: block; height: 27px; line-height: 27px; background-color: rgba(204, 204, 204, 1); font-weight: 300; text-indent: 10px }
.t_border { border: 1px dotted rgba(153, 153, 153, 1); padding: 4px }
div.postText { font: 16px / 24px Georgia, serif }
.c_body .quotetitle { background: url(“http://images.cnblogs.com/likecs_com/baochuan/331634/o_quote.png”) -0 19px no-repeat rgba(255, 255, 255, 1); height: 35px; font-size: 20px }
.c_body blockquote { background: url(“http://images.cnblogs.com/likecs_com/baochuan/331634/o_quote.png”) -75px -20px no-repeat rgba(240, 240, 240, 1); border-radius: 10px; margin: 20px 0; padding: 20px 50px }
th { background-color: rgba(153, 153, 153, 1) }
特别地,探讨动态多线程算法的完美模型,它适合算法的设计和分析,并且能再实际应用中有效实现。
动态多线程:是一类重要的并发平台。程序员只需描述应用中的并行性,这种并发平台包含一个调度器,能自动地进行负载平衡计算,大大减轻了程序员的负担。
特征:嵌套并行、并行循环。
重点关注:工作量、持续时间和并行度的度量标准,这些将用于分析多线程算法。
case:斐波那契数列
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,…
线性递推数列
单位阶跃函数如下:
代码1:
1 int FIB(n){ 2 3 if n <= 1 4 5 return 1; 6 else 7 8 return FIB(n - 1) + FIB(n - 2); 9 }
问题剖析:
当n > 1, 比如2的时候, FIB(0) 会被调用两次。如果是更大的值,必然会出现一个结果重复调用的工作。如下图:
时间复杂度为:T(n) = Θ(Ø^n),是以的指数增长,这个过程用来计算斐波那契数列是个相当慢的方法。——得出结论:低效的方法。
代码2(升级版):采用动态多线程来重写FIB过程,利用代码1中FIB(n-1)和FIB(n-2)彼此独立的特点,可以采用并行计算的方式升级过程。
int P-FIB(n) if n <= 1 return n; else int x = spawn P-FIB(n - 1) int y = P-FIB(n - 2) sync return x + y
关键字spawn的作用:嵌套并行调用。父进程派生子进程,与P-FIB(n – 2)并行执行。
关键字sync作用:同步语句。执行完sync之后,一个过程(父进程)才能安全地使用其派生子过程(子进程)的返回值。sync表明,过程在执行sync后面的语句前,必须等到它的所有派生子过程计算完成。
分析:
时间复杂度由代码1的 T(n) = T(n-1) + T(n-2) 升级为T(n) = max(T(n-1), T(n-2)) ;
这里我们要理解一个重要的图分析:有向无环图
公式:G=(V,E)
——V,代表定点(指令);
——Ε ,代表边(指令间的依赖关系);
—-如:(μ, ν) ∈ Ε 表示指令 μ必须在 ν之前执行。