|
| |
|
|
| |
для: Димок
(11.10.2006 в 09:44)
| | | помогите сделать рекурсию | |
| |
|
|
| |
автор: Димок (11.10.2006 в 09:44) |
|
| | Есть главная страница(форма), где пользователь вводит строку символов:
<html>
<head>
<title>Кодирование по методу Шеннона-Фано</title>
<meta content="TEXT/HTML; CHARSET=WINDOWS-1251" http-equiv=CONTENT-TYPE>
</head>
<body>
<center><strong>Кодирование по методу Шеннона-Фано</strong></center>
<form action="enc.php" method="post">
<table width="30%" border="1" cellspacing="1" cellpadding="1" height="72" align="center">
<tr>
<td width="51%">
<div align="center">исходная строка</div>
</td>
<td colspan="2" width="49%">
<div align="center">
<input type="text" name="string">
</div>
</td>
</tr>
<tr>
<td colspan="3">
<div align="center">
<input type="submit" name="encode" value="зашифровать">
</div>
</td>
</tr>
</table>
</form>
</body>
</html>
|
А вот скрипт обработки и вывода результатов enc.php:
<?php
//функция кодирования
function encode2($arr1,$arr2)
{
echo "<br>";
foreach($arr1 as $key=>$val)
{
do
}
}
function encode($array)
{
$count=count($array);
$backup_array=$array;
if($count>2)
{
do{
$current_value = array_shift($array);
$letter_key = array_keys($backup_array,$current_value);
$new_array[$letter_key[0]] = $current_value;
}while(array_sum($array)>=array_sum($new_array));
$group1[1]=$new_array;
$group2[0]=$array;
}
print_r($group1);
echo "<hr>";
print_r($group2);
echo "<hr>";
}
$string=$_POST['string'];
$string_length=strlen($string);
for($i=0;$i<$string_length;++$i)
{
$symbols[]=$string[$i];
}
$unique_symbols=array_count_values($symbols);
foreach($unique_symbols as $symbol=>$quantity)
{
$probability[$symbol]=$quantity/$string_length;
}
arsort($probability,SORT_NUMERIC);
print "<table width=\"30%\" border=\"1\" cellspacing=\"1\" cellpadding=\"1\">\n";
print " <tr> \n";
print " <td width=\"21%\">исходная строка</td>\n";
print " <td colspan=\"2\"> \n";
print " <div align=\"center\">$string</div>\n";
print " </td>\n";
print " </tr>\n";
print "<tr> \n";
print " <td width=\"21%\"> \n";
print " <div align=\"center\">символ</div>\n";
print " </td>\n";
print " <td width=\"26%\"> \n";
print " <div align=\"center\">вероятность</div>\n";
print " </td>\n";
print " <td width=\"53%\"> \n";
print " <div align=\"center\">код</div>\n";
print " </td>\n";
print " </tr>\n";
foreach($probability as $symbol=>$value)
{
if ($symbol==" ") $symbol="пробел";
print "<tr> \n";
print " <td width=\"21%\"> \n";
print " <div align=\"center\">$symbol</div>\n";
print " </td>\n";
print " <td width=\"26%\"> \n";
print " <div align=\"center\">$value</div>\n";
print " </td>\n";
print " <td width=\"53%\"> \n";
print " <div align=\"center\">01</div>\n";
print " </td>\n";
print " </tr>\n";
}
echo "<br>";
encode($probability);
?>
|
Принцип работы скрипта-выделяет уникальные символы введенной строки, затем выводит их в таблице по убыванию их вероятностей появления, а функция encode() делит полученный массив символ=>значение на 2 группы по принципу: сумма значений обоих групп символов примерно равна.Символам, вошедшим в первую группу присваивается значение единицы(1), а во вторую-нуля(0).
Помогите составить функцию encode2() или модернизировать эту функцию, которая продолжит деление полученных групп по тому же принципу(И так до тех пор,пока в каждой из двух групп не останется по 1 символу) | |
| |
|
|
|