2015-04-09 2 views
1
abstract class CodeTree 
    case class Fork(left: CodeTree, right: CodeTree, chars: List[Char], weight: Int) extends CodeTree 
    case class Leaf(char: Char, weight: Int) extends CodeTree 


type Bit = Int 
def decode(tree: CodeTree, bits: List[Bit]): List[Char] = { 
if(!bits.isEmpty) { 
    bits.head match { 

    case 0 => tree match { 
    case Fork(l, r, _, _) => decode(l, bits.tail) 
    case Leaf(_, _) => chars(tree) ::: decode(frenchCode, bits.tail) 

    } 
    case 1 => tree match { 
    case Fork(l, r, _, _) => decode(r, bits.tail) 
    case Leaf(_, _) => chars(tree) ::: decode(frenchCode, bits.tail) 

    } 
} 
} 
else Nil 
} 

    val frenchCode: CodeTree = Fork(Fork(Fork(Leaf('s',121895),Fork(Leaf('d',56269),Fork(Fork(Fork(Leaf('x',5928),Leaf('j',8351),List('x','j'),14279),Leaf('f',16351),List('x','j','f'),30630),Fork(Fork(Fork(Fork(Leaf('z',2093),Fork(Leaf('k',745),Leaf('w',1747),List('k','w'),2492),List('z','k','w'),4585),Leaf('y',4725),List('z','k','w','y'),9310),Leaf('h',11298),List('z','k','w','y','h'),20608),Leaf('q',20889),List('z','k','w','y','h','q'),41497),List('x','j','f','z','k','w','y','h','q'),72127),List('d','x','j','f','z','k','w','y','h','q'),128396),List('s','d','x','j','f','z','k','w','y','h','q'),250291),Fork(Fork(Leaf('o',82762),Leaf('l',83668),List('o','l'),166430),Fork(Fork(Leaf('m',45521),Leaf('p',46335),List('m','p'),91856),Leaf('u',96785),List('m','p','u'),188641),List('o','l','m','p','u'),355071),List('s','d','x','j','f','z','k','w','y','h','q','o','l','m','p','u'),605362),Fork(Fork(Fork(Leaf('r',100500),Fork(Leaf('c',50003),Fork(Leaf('v',24975),Fork(Leaf('g',13288),Leaf('b',13822),List('g','b'),27110),List('v','g','b'),52085),List('c','v','g','b'),102088),List('r','c','v','g','b'),202588),Fork(Leaf('n',108812),Leaf('t',111103),List('n','t'),219915),List('r','c','v','g','b','n','t'),422503),Fork(Leaf('e',225947),Fork(Leaf('i',115465),Leaf('a',117110),List('i','a'),232575),List('e','i','a'),458522),List('r','c','v','g','b','n','t','e','i','a'),881025),List('s','d','x','j','f','z','k','w','y','h','q','o','l','m','p','u','r','c','v','g','b','n','t','e','i','a'),1486387) 
    val secret: List[Bit] = List(0,0,1,1,1,0,1,0,1,1,1,0,0,1,1,0,1,0,0,1,1,0,1,0,1,1,0,0,1,1,1,1,1,0,1,0,1,1,0,0,0,0,1,0,1,1,1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,1) 
    def decodedSecret: List[Char] = decode(frenchCode, secret)ode here 

Я новичок в Скале, и обучение шаблона теперь, я хочу сделать Хаффман декодирования, теперь я могу получить список, но это не так ответьте, надеюсь кто-то может найти ошибку.Scala кодирования, чтобы сделать декодирование Хаффмана, но неправильный результат

+0

Я уверен, что никто не собирается читать через гигантское дерево с указанием вручную и список бит, чтобы найти ошибку, если она существует. –

ответ

4

С кодом возникает несколько проблем.

  1. Вы не хотите потреблять немного, когда попадаете в лист. Персонаж листа также должен быть добавлен, если в вашем коде нет бит.

  2. В методе декодирования вы не хотите ссылаться на frenchCode, но вместо этого указывается код в качестве параметра.

  3. Вы можете получить доступ к полукокса из листа с помощью сопоставления с образцом, то есть случай листа (codeChar, _) => ...

Btw. ваш код будет более чистым, если вы начнете сопоставление на дереве. Только если он соответствует вилке, вы смотрите на головку своего списка бит.

Надеюсь, что это поможет. ;)

+0

О, спасибо большое, что работает! код должен быть таким: case Leaf (_, _) => chars (tree) ::: decode (frenchCode, bits). Ваше первое предложение полезно. Я знаю, что это своего рода жесткий код, здесь используется французский код, но поскольку я рекурсивно называю декодирование, поэтому при сопоставлении листа дерево уже является листом и не может быть передано для последующего декодирования символов ... – rockmerockme

+0

Да, вы правы, но вы должны убедиться, что функция получает параметризацию frenchCode, иначе вы не сможете использовать функцию декодирования для других деревьев Хаффмана. – uberwach

+0

Плюс один, не потребляя немного при ударе по листу –

Смежные вопросы