Привет всем!
Где можно почитать про архивацию чтоб доступно и с примером!
Просто алгоритмы знаю а как их хорошо «объяснить» VB.Net толком не знаю.
У меня статьи, исходники есть но помним сложно разобраться.
Мы имеем файл длинной в 100 байт и имеющий 6 различных символов в себе. Мы подсчитали вхождение каждого из символов в файл и получили следующее :
|-----------------|-----|-----|-----|-----|-----|-----|
| cимвол | A | B | C | D | E | F |
|-----------------|-----|-----|-----|-----|-----|-----|
| число вхождений | 10 | 20 | 30 | 5 | 25 | 10 |
|-----------------|-----|-----|-----|-----|-----|-----|
Теперь мы берем эти числа и будем называть их частотой вхождения для каждого символа. Разместим таблицу как ниже.
|-----------------|-----|-----|-----|-----|-----|-----|
| cимвол | C | E | B | F | A | D |
|-----------------|-----|-----|-----|-----|-----|-----|
| число вхождений | 30 | 25 | 20 | 10 | 10 | 5 |
|-----------------|-----|-----|-----|-----|-----|-----|
Мы возьмем из последней таблицы символы с наименьшей частотой. В нашем случае это D (5) и какой либо символ из F или A (10), можно взять любой из них например A.
Сформируем из "узлов" D и A новый "узел", частота вхождения для которого будет равна сумме частот D и A :
Частота 30 10 5 10 20 25
Символа C A D F B E
| |
|--|--|
||-|
|15| = 5 + 10
|--|
Номер в рамке - сумма частот символов D и A. Теперь мы снова ищем два символа с самыми низкими частотами вхождения. Исключая из просмотра D и A и рассматривая вместо них новый "узел" с суммарной частотой вхождения. Самая низкая частота теперь у F и нового "узла". Снова сделаем операцию слияния узлов :
Частота 30 10 5 10 20 25
Символа C A D F B E
| | |
| | |
| |--|| |
|-|15|| |
||-| |
| |
| |--| |
|----|25|-| = 10 + 15
|--|
Уж кто бы говорилСлушай не флуди!
Роман-вб писал(а):Sasha_karasovУж кто бы говорилСлушай не флуди!
Private Sub Form_Load()
Dim A As String
A = "Hello"
Dim coutChar As Integer
Dim ch(255) As Boolean
Dim tChar() As String
Dim tpChar() As Long
Dim bChar() As Boolean
Dim nChar() As Integer
Dim ASum As Long
'------------------------------
'Êàêèå ñèìâîëû âõîäÿò â ñòðîêó
'------------------------------
For j = 1 To Len(A)
For i = 0 To 255
If Chr(i) = Mid(A, j, 1) Then ch(i) = True
Next i
Next j
'-----------------------------
'Ñîçäàíèå òàáëèöû
'-----------------------------
For i = 0 To 255
If ch(i) = True Then coutChar = coutChar + 1
Next i
ReDim tChar(coutChar - 1) As String
ReDim tpChar(coutChar - 1) As Long
ReDim bChar(coutChar - 1) As Boolean
ReDim nChar(coutChar - 1) As Integer
Dim cout As Integer
For i = 0 To 255
If ch(i) = True Then
tChar(cout) = Chr(i)
cout = cout + 1
End If
Next i
For j = 0 To coutChar - 1
For i = 1 To Len(A)
If tChar(j) = Mid(A, i, 1) Then tpChar(j) = tpChar(j) + 1
Next i
Next j
'-----------------------------
'Ñîçäàíèå äåðåâà
'-----------------------------
For i = 0 To coutChar - 1
ASum = ASum + tpChar(i)
Next i
'Ïîèñê 2 < çíà÷åíèé
Dim CoutNode As Integer
CoutNode = coutChar
Do
DoEvents
Dim sumNode As Integer
Dim t, t1 As Integer
For i = CoutNode - 1 To 0 Step -1
If bChar(i) = False Then t = i: GoTo 1
Next i
1 For i = CoutNode - 1 To 0 Step -1
If bChar(i) = False Then If tpChar(i) <= tpChar(t) Then t = i
Next i
bChar(t) = True
For i = CoutNode - 1 To 0 Step -1
If bChar(i) = False Then t1 = i: GoTo 2
Next i
2 For i = CoutNode - 1 To 0 Step -1
If bChar(i) = False Then If tpChar(i) <= tpChar(t) Then t1 = i
Next i
bChar(t1) = True
'------------------------
CoutNode = CoutNode + 1
ReDim Preserve tpChar(CoutNode - 1)
ReDim Preserve bChar(CoutNode - 1)
ReDim Preserve nChar(CoutNode - 1)
tpChar(CoutNode - 1) = tpChar(t) + tpChar(t1)
nChar(t1) = CoutNode - 1
nChar(t) = CoutNode - 1
If tpChar(CoutNode - 1) = ASum Then GoTo 3
Loop
3 MsgBox "Âñå!!!"
End Sub
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 55