Huffman algo...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
R4z0r1989
Beiträge: 521
Registriert: 12.06.2005 18:06
Kontaktdaten:

Huffman algo...

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
R4z0r1989
Beiträge: 521
Registriert: 12.06.2005 18:06
Kontaktdaten:

Beitrag 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
Antworten