Seite 1 von 1

Huffman algo...

Verfasst: 24.02.2009 15:22
von R4z0r1989
Hey leute ich bin seit einigen tagen dran mich mit dem huffman algo auseinander zu setzen. und bitte jetzt kein "das gabs schon mal" ich weiß dass es das einmal schon gab und mich der code eindeutig nicht mag da er nur "-0" ausgibt.

und ausserdem will ich ja nicht direkt eine lösung sondern tipps und lösungsansätze da ich es doch irgendwo gern selber schaffen will auf meine schlampige weiße...

wie würdet ihr anfangen?
Welche art von verarbeitung?

Danke im voraus

Verfasst: 24.02.2009 15:31
von STARGÅTE
habs mir nie richtig angesehen, aber diese Seite hier:
Huffman - Algorithmus und Kompression
sieht recht enifach aus, und genauso würde ich ihn dann auch programmieren ...

Verfasst: 24.02.2009 15:50
von R4z0r1989
ich denk mal das stargate meinen sauereicode sehen will um vll mal zu sagen was hier ein absolutes nogo is^^

Code: Alles auswählen

Procedure ShowImage(Image)
  wid = OpenWindow(#PB_Any,0,0,ImageWidth(Image)+10,ImageHeight(Image)+10,"ShowImage",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
  If wid
    If CreateGadgetList(WindowID(wid))
      ImageGadget(#PB_Any,5,5,ImageWidth(Image),ImageHeight(Image),ImageID(Image))
    EndIf
    
    Repeat
      
      event = WaitWindowEvent()
      
      If event = #PB_Event_CloseWindow
        quit = 1
      EndIf
      
    Until quit = 1
    
  EndIf
EndProcedure

Procedure.s RarestChar(Input.s)
  
  Protected amount.l, rarestamount.l, rarestchar.s
  
  Repeat
    amount.l = CountString(Input.s, Left(Input.s,1))
    If rarestamount.l = 0
      rarestamount.l = amount.l
      rarestchar.s = Left(Input.s,1)
    ElseIf rarestamount.l > amount.l
      rarestamount.l = amount.l
      rarestchar.s = Left(Input.s,1)
    EndIf
    Input.s = ReplaceString(Input.s, Left(Input.s,1), "")
  Until Input.s = ""
  
  ProcedureReturn rarestchar.s
  
EndProcedure

Procedure.l RarestAmount(Input.s)
  
  Protected amount.l, rarestamount.l
  
  Repeat
    amount.l = CountString(Input.s, Left(Input.s,1))
    If rarestamount.l = 0
      rarestamount.l = amount.l
    ElseIf rarestamount.l > amount.l
      rarestamount.l = amount.l
    EndIf
    Input.s = ReplaceString(Input.s, Left(Input.s,1), "")
  Until Input.s = ""
  
  ProcedureReturn rarestamount.l
  
EndProcedure

Input$ = "mississippi"

Structure chars
  Char.s
  Amount.l
EndStructure

NewList TreeBeginn.chars()
NewList TreeEdit.chars()

Repeat
  AddElement(TreeBeginn())
  TreeBeginn()\Char = RarestChar(Input$)
  TreeBeginn()\Amount = RarestAmount(Input$)
  Input$ = ReplaceString(Input$, TreeBeginn()\Char, "")
Until Input$ = ""

CreateImage(0,300,300)
StartDrawing(ImageOutput(0))
  ResetList(TreeBeginn())
  While NextElement(TreeBeginn())
    i + 25
    Circle(i-10,280-10,10,RGB(0,255,0))
    DrawingMode(1)
    DrawText(i-10-TextWidth(TreeBeginn()\Char)/2,280-10-TextHeight(TreeBeginn()\Char)/2,TreeBeginn()\Char,RGB(255,0,0))
    DrawText(i-10-TextWidth(TreeBeginn()\Char)/2,280,Str(TreeBeginn()\Amount),RGB(0,255,255))
  Wend
StopDrawing()

ResetList(TreeBeginn())
NextElement(TreeBeginn())
plus1 = TreeBeginn()\Amount
NextElement(TreeBeginn())
plus2 = TreeBeginn()\Amount
Debug plus1 + plus2

ShowImage(Image)

FreeImage(0)
danke im voraus