You are on page 1of 22

.

i PT2`iBQMb M/ S`HH2H JTTBM;

S`HH2H S`Q;`KKBM; BM a+H


oBFiQ` EmM+F
S`HH2HBbK M/ +QHH2+iBQMb

S`HH2H T`Q+2bbBM; Q7 +QHH2+iBQMb Bb BKTQ`iMi

! QM2 i?2 KBM TTHB+iBQMb Q7 T`HH2HBbK iQ/v

q2 2tKBM2 +QM/BiBQMb r?2M i?Bb +M #2 /QM2

! T`QT2`iB2b Q7 +QHH2+iBQMb, #BHBiv iQ bTHBi- +QK#BM2


! T`QT2`iB2b Q7 QT2`iBQMb, bbQ+BiBpBiv- BM/2T2M/2M+2
6mM+iBQMH T`Q;`KKBM; M/ +QHH2+iBQMb

PT2`iBQMb QM +QHH2+iBQMb `2 F2v iQ 7mM+iBQMH T`Q;`KKBM;


KT, TTHv 7mM+iBQM iQ 2+? 2H2K2Mi

! List(1,3,8).map(x => x*x) == List(1, 9, 64)


6mM+iBQMH T`Q;`KKBM; M/ +QHH2+iBQMb

PT2`iBQMb QM +QHH2+iBQMb `2 F2v iQ 7mM+iBQMH T`Q;`KKBM;


KT, TTHv 7mM+iBQM iQ 2+? 2H2K2Mi

! List(1,3,8).map(x => x*x) == List(1, 9, 64)

7QH/, +QK#BM2 2H2K2Mib rBi?  ;Bp2M QT2`iBQM

! List(1,3,8).fold(100)((s,x) => s + x) == 112


6mM+iBQMH T`Q;`KKBM; M/ +QHH2+iBQMb

PT2`iBQMb QM +QHH2+iBQMb `2 F2v iQ 7mM+iBQMH T`Q;`KKBM;


KT, TTHv 7mM+iBQM iQ 2+? 2H2K2Mi

! List(1,3,8).map(x => x*x) == List(1, 9, 64)

7QH/, +QK#BM2 2H2K2Mib rBi?  ;Bp2M QT2`iBQM

! List(1,3,8).fold(100)((s,x) => s + x) == 112

b+M, +QK#BM2 7QH/b Q7 HH HBbi T`2}t2b

! List(1,3,8).scan(100)((s,x) => s + x) == List(100, 101, 104, 112)

h?2b2 QT2`iBQMb `2 2p2M KQ`2 BKTQ`iMi 7Q` T`HH2H i?M b2[m2MiBH
+QHH2+iBQMb, i?2v 2M+TbmHi2 KQ`2 +QKTH2t H;Q`Bi?Kb
*?QB+2 Q7 /i bi`m+im`2b

q2 mb2 GBbi iQ bT2+B7v i?2 `2bmHib Q7 QT2`iBQMb


GBbib `2 MQi ;QQ/ 7Q` T`HH2H BKTH2K2MiiBQMb #2+mb2 r2 +MMQi
2{+B2MiHv

! bTHBi i?2K BM ?H7 UM22/ iQ b2`+? 7Q` i?2 KB//H2V


! +QK#BM2 i?2K U+QM+i2MiBQM M22/b HBM2` iBK2V
*?QB+2 Q7 /i bi`m+im`2b

q2 mb2 GBbi iQ bT2+B7v i?2 `2bmHib Q7 QT2`iBQMb


GBbib `2 MQi ;QQ/ 7Q` T`HH2H BKTH2K2MiiBQMb #2+mb2 r2 +MMQi
2{+B2MiHv

! bTHBi i?2K BM ?H7 UM22/ iQ b2`+? 7Q` i?2 KB//H2V


! +QK#BM2 i?2K U+QM+i2MiBQM M22/b HBM2` iBK2V

q2 mb2 7Q` MQr i?2b2 Hi2`MiBp2b

! ``vb, BKT2`iBp2 U`2+HH ``v bmKV


! i`22b, +M #2 BKTH2K2Mi2/ 7mM+iBQMHHv

am#b2[m2Mi H2+im`2b 2tKBM2 a+HǶb T`HH2H +QHH2+iBQM HB#``B2b

! BM+Hm/2b KMv KQ`2 /i bi`m+im`2b- BKTH2K2Mi2/ 2{+B2MiHv


JT, K2MBM; M/ T`QT2`iB2b

JT TTHB2b  ;Bp2M 7mM+iBQM iQ 2+? HBbi 2H2K2Mi


List(1,3,8).map(x => x*x) == List(1, 9, 64)
GBbiU1 - 2 - Ę- M VXKTU7V 44 GBbiU7U1 V- 7U2 V- Ę- 7UM VV
S`QT2`iB2b iQ F22T BM KBM/,

! list.map(x => x) == list


! list.map(f.compose(g)) == list.map(g).map(f)

_2+HH i?i (f.compose(g))(x) = f(g(x))


JT b 7mM+iBQM QM HBbib

a2[m2MiBH /2}MBiBQM,

def mapSeq[A,B](lst: List[A], f : A => B): List[B] = lst match {


case Nil => Nil
case h :: t => f(h) :: mapSeq(t,f)
}

q2 rQmH/ HBF2  p2`bBQM i?i T`HH2HBx2b

! +QKTmiiBQMb Q7 f(h) 7Q` /Bz2`2Mi 2H2K2Mib h


! }M/BM; i?2 2H2K2Mib i?2Kb2Hp2b UHBbi Bb MQi  ;QQ/ +?QB+2V
a2[m2MiBH KT Q7 M ``v T`Q/m+BM; M ``v

def mapASegSeq[A,B](inp: Array[A], left: Int, right: Int, f : A => B,


out: Array[B]) = {
// Writes to out(i) for left <= i <= right-1
var i= left
inp
while (i < right) {
f f f f f f f
out(i)= f(inp(i))
i= i+1
out
} }
val in= Array(2,3,4,5,6)
val out= Array(0,0,0,0,0)
val f= (x:Int) => x*x
mapASegSeq(in, 1, 3, f, out)
out

res1: Array[Int] = Array(0, 9, 16, 0, 0)


S`HH2H KT Q7 M ``v T`Q/m+BM; M ``v

def mapASegPar[A,B](inp: Array[A], left: Int, right: Int, f : A => B,


out: Array[B]): Unit = {
// Writes to out(i) for left <= i <= right-1
if (right - left < threshold)
mapASegSeq(inp, left, right, f, out)
else {
val mid = left + (right - left)/2
parallel(mapASegPar(inp, left, mid, f, out),
mapASegPar(inp, mid, right, f, out))
inp
}
f f f f f f f
}
LQi2,
out
! r`Bi2b M22/ iQ #2 /BbDQBMi UQi?2`rBb2, MQM@/2i2`KBMBbiB+ #2?pBQ`V
! i?`2b?QH/ M22/b iQ #2 H`;2 2MQm;? UQi?2`rBb2 r2 HQb2 2{+B2M+vV
1tKTH2 Q7 mbBM; KTa2;S`, TQBMirBb2 2tTQM2Mi

_Bb2 2+? ``v 2H2K2Mi iQ TQr2` T,


``v(1 , 2 , . . . , M ) −→ ``v(|1 |T , |2 |T , . . . , |M |T )
q2 +M mb2 T`2pBQmbHv /2}M2/ ?B;?2`@Q`/2` 7mM+iBQMb,

val p: Double = 1.5


def f(x: Int): Double = power(x, p)

mapASegSeq(inp, 0, inp.length, f, out) // sequential

mapASegPar(inp, 0, inp.length, f, out) // parallel


1tKTH2 Q7 mbBM; KTa2;S`, TQBMirBb2 2tTQM2Mi

_Bb2 2+? ``v 2H2K2Mi iQ TQr2` T,


``v(1 , 2 , . . . , M ) −→ ``v(|1 |T , |2 |T , . . . , |M |T )
q2 +M mb2 T`2pBQmbHv /2}M2/ ?B;?2`@Q`/2` 7mM+iBQMb,

val p: Double = 1.5


def f(x: Int): Double = power(x, p)

mapASegSeq(inp, 0, inp.length, f, out) // sequential

mapASegPar(inp, 0, inp.length, f, out) // parallel

Zm2biBQMb QM T2`7Q`KM+2,

! `2 i?2`2 T2`7Q`KM+2 ;BMb 7`QK T`HH2H 2t2+miBQM


! T2`7Q`KM+2 Q7 `2@mbBM; ?B;?2`@Q`/2` 7mM+iBQMb pb `2@BKTH2K2MiBM;
a2[m2MiBH TQBMirBb2 2tTQM2Mi r`Bii2M 7`QK b+`i+?

def normsOf(inp: Array[Int], p: Double,


left: Int, right: Int,
out: Array[Double]): Unit = {
var i= left
while (i < right) {
out(i)= power(inp(i),p)
i= i+1
}
}
S`HH2H TQBMirBb2 2tTQM2Mi r`Bii2M 7`QK b+`i+?

def normsOfPar(inp: Array[Int], p: Double,


left: Int, right: Int,
out: Array[Double]): Unit = {
if (right - left < threshold) {
var i= left
while (i < right) {
out(i)= power(inp(i),p)
i= i+1
}
} else {
val mid = left + (right - left)/2
parallel(normsOfPar(inp, p, left, mid, out),
normsOfPar(inp, p, mid, right, out))
}
}
J2bm`2/ T2`7Q`KM+2 mbBM; b+HK2i2`

! BMTXH2M;i? 4 kyyyyyy
! i?`2b?QH/ 4 Ryyyy
! AMi2HU_V *Q`2UhJV Bd@jddyE *Sl ! jX8y:>x U9@+Q`2- 3 >q
i?`2/bV- Re:" _J

2tT`2bbBQM iBK2(Kb)
KTa2;a2[(BMT, 0, BMT.H2M;i?, 7, Qmi) 174.17
KTa2;S`(BMT, 0, BMT.H2M;i?, 7, Qmi) 28.93
MQ`KbP7a2[(BMT, T, 0, BMT.H2M;i?, Qmi) 166.84
MQ`KbP7S`(BMT, T, 0, BMT.H2M;i?, Qmi) 28.17
J2bm`2/ T2`7Q`KM+2 mbBM; b+HK2i2`

! BMTXH2M;i? 4 kyyyyyy
! i?`2b?QH/ 4 Ryyyy
! AMi2HU_V *Q`2UhJV Bd@jddyE *Sl ! jX8y:>x U9@+Q`2- 3 >q
i?`2/bV- Re:" _J

2tT`2bbBQM iBK2(Kb)
KTa2;a2[(BMT, 0, BMT.H2M;i?, 7, Qmi) 174.17
KTa2;S`(BMT, 0, BMT.H2M;i?, 7, Qmi) 28.93
MQ`KbP7a2[(BMT, T, 0, BMT.H2M;i?, Qmi) 166.84
MQ`KbP7S`(BMT, T, 0, BMT.H2M;i?, Qmi) 28.17

S`HH2HBxiBQM Tvb Qz
JMmHHv `2KQpBM; ?B;?2`@Q`/2` 7mM+iBQMb /Q2b MQi Tv Qz
S`HH2H KT QM BKKmi#H2 i`22b

*QMbB/2` i`22b r?2`2

! H2p2b biQ`2 ``v b2;K2Mib


! MQM@H27 MQ/2 biQ`2b irQ bm#i`22b

sealed abstract class Tree[A] { val size: Int }


case class Leaf[A](a: Array[A]) extends Tree[A] {
override val size = a.size
}
case class Node[A](l: Tree[A], r: Tree[A]) extends Tree[A] {
override val size = l.size + r.size
}

bbmK2 i?i Qm` i`22b `2 #HM+2/, r2 +M 2tTHQ`2 #`M+?2b BM T`HH2H
S`HH2H KT QM BKKmi#H2 i`22b

def mapTreePar[A:Manifest,B:Manifest](t: Tree[A], f: A => B) : Tree[B] =


t match {
case Leaf(a) => {
val len = a.length; val b = new Array[B](len)
var i= 0
while (i < len) { b(i)= f(a(i)); i= i + 1 }
Leaf(b) }
case Node(l,r) => {
val (lb,rb) = parallel(mapTreePar(l,f), mapTreePar(r,f))
Node(lb, rb) }
}

aT22/mT M/ T2`7Q`KM+2 bBKBH` b 7Q` i?2 ``v


:Bp2 /2Ti? #QmM/ Q7 KTh`22S`

:Bp2  +Q``2+i #mi b iB;?i b TQbbB#H2 bvKTiQiB+ T`HH2H +QKTmiiBQM


/2Ti? #QmM/ 7Q` mapTreePar TTHB2/ iQ +QKTH2i2 i`22b rBi? ?2B;?i ? M/ 2?
MQ/2b- bbmKBM; i?2 Tbb2/ }`bi@+Hbb 7mM+iBQM 7 2t2+mi2b BM +QMbiMi iBK2X

RX 2?
kX ?
jX HQ; ?
9X ? HQ; ?
8X ?2?
:Bp2 /2Ti? #QmM/ Q7 KTh`22S`

:Bp2  +Q``2+i #mi b iB;?i b TQbbB#H2 bvKTiQiB+ T`HH2H +QKTmiiBQM


/2Ti? #QmM/ 7Q` mapTreePar TTHB2/ iQ +QKTH2i2 i`22b rBi? ?2B;?i ? M/ 2?
MQ/2b- bbmKBM; i?2 Tbb2/ }`bi@+Hbb 7mM+iBQM 7 2t2+mi2b BM +QMbiMi iBK2X

RX 2?
kX ?
jX HQ; ?
9X ? HQ; ?
8X ?2?

Mbr2`, ?X h?2 +QKTmiiBQM /2Ti? 2[mHb i?2 ?2B;?i Q7 i?2 i`22X


*QKT`BbQM Q7 ``vb M/ BKKmi#H2 i`22b

``vb,

! UYV `M/QK ++2bb iQ 2H2K2Mib- QM b?`2/ K2KQ`v +M b?`2 ``v


! UYV ;QQ/ K2KQ`v HQ+HBiv
! U@V BKT2`iBp2, Kmbi 2Mbm`2 T`HH2H ibFb r`Bi2 iQ /BbDQBMi T`ib
! U@V 2tT2MbBp2 iQ +QM+i2Mi2

AKKmi#H2 i`22b,

! UYV Tm`2Hv 7mM+iBQMH- T`Q/m+2 M2r i`22b- F22T QH/ QM2b


! UYV MQ M22/ iQ rQ``v #Qmi /BbDQBMiM2bb Q7 r`Bi2b #v T`HH2H ibFb
! UYV 2{+B2Mi iQ +QK#BM2 irQ i`22b
! U@V ?B;? K2KQ`v HHQ+iBQM Qp2`?2/
! U@V #/ HQ+HBiv

You might also like