You are on page 1of 24

*QM+@h`22b

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


H2FbM/` S`QFQT2+
GBbi .i hvT2

G2iǶb `2+HH i?2 HBbi /i ivT2 BM 7mM+iBQMH T`Q;`KKBM;X

sealed trait List[+T] {


def head: T
def tail: List[T]
}

case class ::[T](head: T, tail: List[T])


extends List[T]

case object Nil extends List[Nothing] {


def head = sys.error(ŏempty listŏ)
def tail = sys.error(ŏempty listŏ)
}
GBbi .i hvT2

>Qr /Q r2 BKTH2K2Mi  filter K2i?Q/ QM HBbib\


GBbi .i hvT2

>Qr /Q r2 BKTH2K2Mi  filter K2i?Q/ QM HBbib\

def filter[T](lst: List[T])(p: T => Boolean): List[T] = lst match {


case x :: xs if p(x) => x :: filter(xs)(p)
case x :: xs => filter(xs)(p)
case Nil => Nil
}
h`22b

GBbib `2 #mBHi 7Q` b2[m2MiBH +QKTmiiBQMb Ĝ i?2v `2 i`p2`b2/ 7`QK H27i iQ
`B;?iX
h`22b

GBbib `2 #mBHi 7Q` b2[m2MiBH +QKTmiiBQMb Ĝ i?2v `2 i`p2`b2/ 7`QK H27i iQ
`B;?iX
h`22b HHQr T`HH2H +QKTmiiBQMb Ĝ i?2B` bm#i`22b +M #2 i`p2`b2/ BM
T`HH2HX
h`22b

GBbib `2 #mBHi 7Q` b2[m2MiBH +QKTmiiBQMb Ĝ i?2v `2 i`p2`b2/ 7`QK H27i iQ
`B;?iX
h`22b HHQr T`HH2H +QKTmiiBQMb Ĝ i?2B` bm#i`22b +M #2 i`p2`b2/ BM
T`HH2HX

sealed trait Tree[+T]

case class Node[T](left: Tree[T], right: Tree[T])


extends Tree[T]

case class Leaf[T](elem: T) extends Tree[T]

case object Empty extends Tree[Nothing]


6BHi2` PM h`22b

>Qr /Q r2 BKTH2K2Mi  }Hi2` K2i?Q/ QM i`22b\


6BHi2` PM h`22b

>Qr /Q r2 BKTH2K2Mi  }Hi2` K2i?Q/ QM i`22b\

def filter[T](t: Tree[T])(p: T => Boolean): Tree[T] = t match {


case Node(left, right) => Node(parallel(filter(left)(p), filter(right)(p)))
case Leaf(elem) => if (p(elem)) t else Empty
case Empty => Empty
}
6BHi2` PM h`22b

>Qr /Q r2 BKTH2K2Mi  }Hi2` K2i?Q/ QM i`22b\

def filter[T](t: Tree[T])(p: T => Boolean): Tree[T] = t match {


case Node(left, right) => Node(parallel(filter(left)(p), filter(right)(p)))
case Leaf(elem) => if (p(elem)) t else Empty
case Empty => Empty
}
*QM+ .i hvT2

h`22b `2 MQi ;QQ/ 7Q` T`HH2HBbK mMH2bb i?2v `2 #HM+2/X
*QM+ .i hvT2

h`22b `2 MQi ;QQ/ 7Q` T`HH2HBbK mMH2bb i?2v `2 #HM+2/X
G2iǶb /2pBb2  /i ivT2 +HH2/ Conc- r?B+? `2T`2b2Mib #HM+2/ i`22b,

sealed trait Conc[+T] {


def level: Int
def size: Int
def left: Conc[T]
def right: Conc[T]
}

AM T`HH2H T`Q;`KKBM;- i?Bb /i ivT2 Bb FMQrM b i?2 +QM+@HBbi


UBMi`Q/m+2/ BM i?2 6Q`i`2bb HM;m;2VX
*QM+ .i hvT2

*QM+`2i2 BKTH2K2MiiBQMb Q7 i?2 Conc /i ivT2,

case object Empty extends Conc[Nothing] {


def level = 0
def size = 0
}
class Single[T](val x: T) extends Conc[T] {
def level = 0
def size = 1
}
case class <>[T](left: Conc[T], right: Conc[T]) extends Conc[T] {
val level = 1 + math.max(left.level, right.level)
val size = left.size + right.size
}
*QM+ .i hvT2 AMp`BMib

AM //BiBQM- r2 rBHH /2}M2 i?2 7QHHQrBM; BMp`BMib 7Q` *QM+@i`22b,

RX  <> MQ/2 +M M2p2` +QMiBM Empty b Bib bm#i`22X


kX h?2 level /Bz2`2M+2 #2ir22M i?2 H27i M/ i?2 `B;?i bm#i`22 Q7  <>
MQ/2 Bb Hrvb R Q` H2bbX
*QM+ .i hvT2 AMp`BMib

AM //BiBQM- r2 rBHH /2}M2 i?2 7QHHQrBM; BMp`BMib 7Q` *QM+@i`22b,

RX  <> MQ/2 +M M2p2` +QMiBM Empty b Bib bm#i`22X


kX h?2 level /Bz2`2M+2 #2ir22M i?2 H27i M/ i?2 `B;?i bm#i`22 Q7  <>
MQ/2 Bb Hrvb R Q` H2bbX

q2 rBHH `2Hv QM i?2b2 BMp`BMib iQ BKTH2K2Mi +QM+i2MiBQM,

def <>(that: Conc[T]): Conc[T] = {


if (this == Empty) that
else if (that == Empty) this
else concat(this, that)
}
*QM+i2MiBQM rBi? i?2 *QM+ .i hvT2

*QM+i2MiBQM M22/b iQ +QMbB/2` b2p2`H +b2bX


6B`bi- i?2 irQ i`22b +QmH/ ?p2 ?2B;?i /Bz2`2M+2 R Q` H2bb,
*QM+i2MiBQM rBi? i?2 *QM+ .i hvT2

*QM+i2MiBQM M22/b iQ +QMbB/2` b2p2`H +b2bX


6B`bi- i?2 irQ i`22b +QmH/ ?p2 ?2B;?i /Bz2`2M+2 R Q` H2bb,

def concat[T](xs: Conc[T], ys: Conc[T]): Conc[T] = {


val diff = ys.level - xs.level
if (diff >= -1 && diff <= 1) new <>(xs, ys)
else if (diff < -1) {
*QM+i2MiBQM rBi? i?2 *QM+ .i hvT2

Pi?2`rBb2- H2iǶb bbmK2 i?i i?2 H27i i`22 Bb ?B;?2` i?M i?2 `B;?i QM2X
*QM+i2MiBQM rBi? i?2 *QM+ .i hvT2

Pi?2`rBb2- H2iǶb bbmK2 i?i i?2 H27i i`22 Bb ?B;?2` i?M i?2 `B;?i QM2X

*b2 R, h?2 H27i i`22 Bb H27i@H2MBM;X


_2+m`bBp2Hv +QM+i2Mi2 i?2 `B;?i bm#i`22X
*QM+i2MiBQM rBi? i?2 *QM+ .i hvT2

if (xs.left.level >= xs.right.level) {


val nr = concat(xs.right, ys)
new <>(xs.left, nr)
} else {
*QM+i2MiBQM rBi? i?2 *QM+ .i hvT2

*b2 k, h?2 H27i i`22 Bb `B;?i@H2MBM;X


*QM+i2MiBQM rBi? i?2 *QM+ .i hvT2

} else {
val nrr = concat(xs.right.right, ys)
if (nrr.level == xs.level - 3) {
val nl = xs.left
val nr = new <>(xs.right.left, nrr)
new <>(nl, nr)
} else {
val nl = new <>(xs.left, xs.right.left)
val nr = nrr
new <>(nl, nr)
}
}
amKK`v

Zm2biBQM, q?i Bb i?2 +QKTH2tBiv Q7 <> K2i?Q/\

! P(HQ; M)
! P(?1 − ?2 )
! P(M)
! P(1)
amKK`v

Zm2biBQM, q?i Bb i?2 +QKTH2tBiv Q7 <> K2i?Q/\

! P(HQ; M)
! P(?1 − ?2 )
! P(M)
! P(1)

*QM+i2MiBQM iF2b P(?1 − ?2 ) iBK2- r?2`2 ?1 M/ ?2 `2 i?2 ?2B;?ib Q7


i?2 irQ i`22bX

You might also like