На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Построение кода Хаффмана: Пролог, Хаскель.
    В общем-то неглупому человеку, но в силу его невероятной лени, тупому студенту-программисту дали задание на курсовую - "Построение кода Хаффмана" на Прологе и Хакеле. Студент, попутно думая, то ли он не ту специальность выбрал, то ли он вообще некудышний, начал все таки копаться по этой теме. В первый день он понял, что 100стр какого-то учебника, прочитанные втечение семестра "рука-лицо" будет недостаточно для самостоятельного написания курсовой в достаточно короткие сроки...
    На второй день он нашел Huffman Coding в сети и на Прологе и на Хаскеле.
    Теперь же он надеется на небольшую безвозмездную помощь от гуру программирования, которая заключилась бы в написании комментариев к готовому коду, для создания стартого ускорения, так сказать, в написании курсовй.
    Код:
    Пролог
    Скрытый текст
    huffman :-
    L = 'this is an example for huffman encoding',
    atom_chars(L, LA),
    msort(LA, LS),
    packList(LS, PL),
    sort(PL, PLS),
    build_tree(PLS, A),
    coding(A, [], C),
    sort(C, SC),
    format('Symbol~t Weight~t~30|Code~n'),
    maplist(print_code, SC).




    build_tree([[V1|R1], [V2|R2]], [V, [V1|R1], [V2|R2]]) :-
    V is V1+V2.


    build_tree([[V1|R1], [V2|R2] | T], AF) :-
    V is V1 + V2,
    A = [V, [V1|R1], [V2|R2]],
    sort([A| T], NT),
    build_tree(NT, AF).


    coding([_A,FG,FD], Code, CF) :-
    ( is_node(FG) ->
    coding(FG, [0 | Code], C1);
    leaf_coding(FG, [0|Code], C1)
    ),
    ( is_node(FD) ->
    coding(FD, [1 | Code], C2);
    leaf_coding(FD, [1 | Code], C2)
    ),
    append(C1, C2, CF).

    leaf_coding([FG,FD], Code, CF) :-
    reverse(Code, CodeR),
    CF = [[FG, FD, CodeR]] .


    is_node([_V, _FG, _FD]).


    print_code([N, Car, Code]):-
    format('~w :~t~w~t~30|', [Car, N]),
    forall(member(V, Code), write(V)),
    nl.


    Хаскель
    Хаскель
    packList([],[]).

    packList([X],[[1,X]]) :- !.

    packList([X|Rest],[XRun|Packed]):-
    run(X,Rest, XRun,RRest),
    packList(RRest,Packed).

    run(Var,[],[1,Var],[]).

    run(Var,[Var|LRest],[N1,Var],RRest):-
    run(Var,LRest,[N, Var],RRest),
    N1 is N + 1.

    run(Var,[Other|RRest], [1,Var],[Other|RRest]):-
    dif(Var,Other).


    import Data.List
    import Control.Arrow
    import Data.Ord

    data HTree a = Leaf a | Branch (HTree a) (HTree a)
    deriving (Show, Eq, Ord)

    freq :: (Ord a) => [a] -> [(Int, a)]
    freq = map(length &&& head). group. sort

    serialize :: HTree d -> [(d, String)]
    serialize (Branch l r) = map (second('0':)) (serialize l) ++ map (second('1':)) (serialize r)
    serialize (Leaf x) = [(x, "")]

    htree :: (Ord t, Num t) => [(t, HTree a)] -> HTree a
    htree [(_, t)] = t
    htree ((w1,t1):(w2,t2):wts) =
    htree $ insertBy (comparing fst) (w1 + w2, Branch t1 t2) wts

    huffman :: (Ord w, Num w) => [(w, a)] -> [(a, String)]
    huffman = serialize. htree. sortBy (comparing fst). map (second Leaf)


    Добавлено
    Не понял, как редактировать написанные сообщения... В коде я там намудрил.
    Вот нормальный вариант.
    Пролог
    huffman :-
    L = 'this is an example for huffman encoding',
    atom_chars(L, LA),
    msort(LA, LS),
    packList(LS, PL),
    sort(PL, PLS),
    build_tree(PLS, A),
    coding(A, [], C),
    sort(C, SC),
    format('Symbol~t Weight~t~30|Code~n'),
    maplist(print_code, SC).




    build_tree([[V1|R1], [V2|R2]], [V, [V1|R1], [V2|R2]]) :-
    V is V1+V2.


    build_tree([[V1|R1], [V2|R2] | T], AF) :-
    V is V1 + V2,
    A = [V, [V1|R1], [V2|R2]],
    sort([A| T], NT),
    build_tree(NT, AF).


    coding([_A,FG,FD], Code, CF) :-
    ( is_node(FG) ->
    coding(FG, [0 | Code], C1);
    leaf_coding(FG, [0|Code], C1)
    ),
    ( is_node(FD) ->
    coding(FD, [1 | Code], C2);
    leaf_coding(FD, [1 | Code], C2)
    ),
    append(C1, C2, CF).

    leaf_coding([FG,FD], Code, CF) :-
    reverse(Code, CodeR),
    CF = [[FG, FD, CodeR]] .


    is_node([_V, _FG, _FD]).


    print_code([N, Car, Code]):-
    format('~w :~t~w~t~30|', [Car, N]),
    forall(member(V, Code), write(V)),
    nl.



    packList([],[]).

    packList([X],[[1,X]]) :- !.

    packList([X|Rest],[XRun|Packed]):-
    run(X,Rest, XRun,RRest),
    packList(RRest,Packed).

    run(Var,[],[1,Var],[]).

    run(Var,[Var|LRest],[N1,Var],RRest):-
    run(Var,LRest,[N, Var],RRest),
    N1 is N + 1.

    run(Var,[Other|RRest], [1,Var],[Other|RRest]):-
    dif(Var,Other).


    Хаскель
    import Data.List
    import Control.Arrow
    import Data.Ord

    data HTree a = Leaf a | Branch (HTree a) (HTree a)
    deriving (Show, Eq, Ord)

    freq :: (Ord a) => [a] -> [(Int, a)]
    freq = map(length &&& head). group. sort

    serialize :: HTree d -> [(d, String)]
    serialize (Branch l r) = map (second('0':)) (serialize l) ++ map (second('1':)) (serialize r)
    serialize (Leaf x) = [(x, "")]

    htree :: (Ord t, Num t) => [(t, HTree a)] -> HTree a
    htree [(_, t)] = t
    htree ((w1,t1):(w2,t2):wts) =
    htree $ insertBy (comparing fst) (w1 + w2, Branch t1 t2) wts

    huffman :: (Ord w, Num w) => [(w, a)] -> [(a, String)]
    huffman = serialize. htree. sortBy (comparing fst). map (second Leaf)
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0404 ]   [ 15 queries used ]   [ Generated: 18.07.25, 03:56 GMT ]