ulufalega
I lenei tusiga o le a ou talanoa e uiga i le lauiloa Huffman algorithm, faʻapea foʻi ma lona faʻaogaina i le faʻapipiʻiina o faʻamaumauga.
O se taunuuga, o le a matou tusia se faila faigofie. O lea ua uma ona talanoaina
O nai manatu
I se faila faila masani, e tasi le tagata e faʻailogaina i le 8 bits (ASCII encoding) poʻo le 16 (Unicode encoding). Le isi o le a tatou mafaufau i le ASCII encoding. Mo se faʻataʻitaʻiga, ave le laina s1 = "FAI mai SUSIE E FAIFAI". E 22 le aofa'i o mata'itusi i le laina, e masani lava, e aofia ai avanoa ma le laina fou - 'n'. O le faila o loʻo i ai lenei laina o le a mamafa 22 * 8 = 176 bits. O le fesili e tulaʻi mai loa: pe talafeagai le faʻaogaina o 8 bits uma e faʻapipiʻi ai le 1 uiga? Matou te le fa'aogaina uma mataitusi ASCII. E tusa lava pe latou te faia, o le a sili atu le saʻo mo le mataitusi sili ona taatele - S - e tuʻuina atu i ai le code sili ona puupuu, ma mo le mataitusi sili ona seasea - T (poʻo U, poʻo 'n') - ia tuʻuina atu se code umi. O le mea lea e aofia ai le Huffman algorithm: e manaʻomia le suʻeina o le filifiliga sili ona lelei e faʻaogaina ai le faila o le mamafa maualalo. E masani lava o le umi o le numera o le a eseese mo faʻailoga eseese - o le mea lea e faʻavae ai le algorithm.
Coding
Aiseā e le tuʻuina atu ai le uiga 'S' se code, mo se faʻataʻitaʻiga, 1 bit le umi: 0 poʻo le 1. Ia avea ma 1. Ona sosoo ai lea ma le uiga masani lona lua - ' ' (space) - tuʻuina atu le 0. Vaʻai faalemafaufau ua e amata faʻavasega lau savali - le manoa fa'ailoga s1 - ma e te va'ai e amata le code i le 1. O lea la, o le a lau mea e fai: o le uiga S lea, pe o se isi uiga, mo se fa'ata'ita'iga A? O le mea lea, e tulaʻi mai se tulafono taua:
E le tatau ona avea le code ma se prefix o le isi
Ole tulafono ole ki ile algorithm. O le mea lea, o le fatuina o se code e amata i se laulau faʻasolosolo, lea e faʻaalia ai le taimi (numera o mea e tutupu) o faʻailoga taʻitasi:
O mataitusi e tele mea e tutupu e tatau ona fa'aitiitiina fa'ailoga mafai numera o fasi. O le a ou tuʻuina atu se faʻataʻitaʻiga o se tasi o laulau faʻailoga e mafai:
O lea la o le a foliga mai o le feʻau faʻailoga e pei o lenei:
10 01111 10 110 1111 00 10 010 1110 10 00 110 0110 00 110 10 00 1111 010 10 1110 01110
Na ou vavaeeseina le code o uiga taitasi ma se avanoa. E le tupu lenei mea i se faila faʻapipiʻi moni!
O le fesili e tulaʻi mai: na faʻafefea ona maua e lenei tama talavou le tulafono e fai ai se laulau o tulafono? O le a talanoaina i lalo.
Fausia se laau Huffman
O iinei e sau ai laau su'esu'e binary e laveai. Aua e te popole, e te le manaʻomia le suʻega, faʻaofi, pe tape auala iinei. O le fausaga o laʻau i java:
public class Node {
private int frequence;
private char letter;
private Node leftChild;
private Node rightChild;
...
}
class BinaryTree {
private Node root;
public BinaryTree() {
root = new Node();
}
public BinaryTree(Node root) {
this.root = root;
}
...
}
E le o le code atoa lea, o le code atoa o le a i lalo.
O le algorithm lenei mo le fausiaina o le laau:
- Fausia se mea Node mo tagata ta'itasi mai le fe'au (laina s1). I la matou tulaga o le ai ai 9 nodes (Node mea faitino). O node ta'itasi e aofia ai fa'amaumauga e lua: fa'ailoga ma fa'atele
- Fausia se mea Laau (BinaryTree) mo Node taitasi. E avea le pona ma a'a o le laau.
- Fa'aofi nei la'au i le laina fa'amuamua. O le maualalo o le taimi, o le maualuga foi lea o le faamuamua. O le mea lea, pe a suʻeina, o le dervo ma le maualalo maualalo e filifilia i taimi uma.
O le isi mea e tatau ona e faia faʻataʻamilomilo nei:
- Aveese ni la'au se lua mai le laina fa'amuamua ma fai i la'ua ma fanau o le node fou (le node fou na faia e aunoa ma le mataitusi). Ole tele ole node fou e tutusa ma le aofaʻi o laina ole laʻau e tupuga mai ai e lua.
- Mo lenei node, fai se laau e iai le a'a i lenei node. Fa'aofi le la'au lenei i tua i le laina fa'amuamua. (Talu ai o le laau e iai se taimi fou, e foliga mai e aliali mai i se nofoaga fou i le laina)
- Fa'aauau la'asaga 1 ma le 2 se'ia na'o le tasi le la'au o totoe i le laina - o le La'au Huffman
Mafaufau i lenei algorithm ile laina s1:
O le faailoga "lf" (linefeed) o lona uiga o se laina fou, "sp" (space) o se avanoa.
O le a le mea e sosoʻo
Sa matou maua se laau Huffman. Ua lelei. Ae o le a le mea e fai i ai? Latou te le ave fua ma e tatau ona e suʻeina auala uma mai le aʻa i lau o le laau. Se'i tatou malilie e fa'ailoa le mata 0 pe afai e tau atu i le tamaititi agavale ma le 1 pe a tau atu i le taumatau. I le tautala saʻo, i lenei faʻamatalaga, o le faʻailoga o se faʻailoga o le ala mai le aʻa o le laau i le lau o loʻo i ai lenei lava faʻailoga.
O le ala lea na i ai le laulau o tulafono laiti. Manatua pe a tatou mafaufau i lenei laulau, e mafai ona tatou faʻaiʻu e uiga i le "mamafa" o faʻailoga taʻitasi - o le umi lea o lona code. Ona, i le faʻapipiʻiina, o le faila muamua o le a mamafa: 2 * 3 + 2 * 4 + 3 * 3 + 6 * 2 + 1 * 4 + 1 * 5 + 2 * 4 + 4 * 2 + 1 * 5 = 65 bits . I le taimi muamua e 176 bits le mamafa. O le mea lea, na matou faʻaititia i le 176/65 = 2.7 taimi! Ae o se utopia lenei. E foliga mai e le mafai ona maua se fa'apena fa'apea. Aisea? O le a talanoaina lenei mea i se taimi mulimuli ane.
Filifiliga
Ia, masalo o le mea sili ona faigofie o loʻo totoe o le decoding. Ou te manatu o le toatele o outou ua mateina e le mafai ona matou fatuina se faila faʻapipiʻi e aunoa ma se faʻamatalaga o le auala na faʻaogaina ai - o le a le mafai ona matou faʻaogaina! Ioe, ioe, sa faigata ia te aʻu ona iloa lenei mea, ae e tatau ona ou fatuina se faila faila table.txt ma se laulau faʻamalosi:
01110
00
A010
E1111
I110
S10
T0110
U01111
Y1110
Fa'ailoga o le laulau i le fa'ailoga 'faailoga' 'code code'. Aisea ua leai ai se faailoga 01110? O le mea moni, o loʻo i ai se faʻailoga, e naʻo le java meafaigaluega ou te faʻaaogaina pe a faʻapipiʻi i se faila, o le laina fou - 'n' - ua liua i se laina fou (tusa lava pe o le a le faʻavalevalea e foliga mai). O le mea lea, o le laina gaogao i le pito i luga o le amio mo le code 01110. Mo le code 00, o le amio o se avanoa i le amataga o le laina. O le a ou fai atu i le taimi lava lena mo le tatou Khan coefficient, o lenei metotia o le teuina o se laulau e mafai ona fai mai e sili ona le talafeagai. Ae e faigofie ona malamalama ma faatino. O le a ou fiafia e faʻalogo i au fautuaga i faʻamatalaga e uiga i le optimization.
O le i ai o lenei laulau e matua faigofie ai ona fa'avasega. Sei o tatou manatua le tulafono na tatou mulimuli ai i le fatuina o le encoding:
E le tatau ona avea le code ma se prefix o le isi
O le mea lea e fai ai se sao faafaigofie. Matou te faitau faasolosolo i sina mea itiiti ma, o le taimi lava e maua ai le manoa d, e aofia ai fasi faitau, e fetaui ma le faʻailoga e fetaui ma le uiga o le tagata, e vave ona matou iloa o le amio (ma na o ia!) O le isi, matou te tusia uiga i le laina decoding (le laina o loʻo i ai le feʻau faʻasalalau), toe seti le laina d, ona faitau lea o le faila faila.
Реализация
Ua oʻo i le taimi e faʻalumaina ai laʻu code ma tusi se faila. Tatou ta'ua o le Compressor.
Toe amata. Muamua, matou te tusia le vasega Node:
public class Node {
private int frequence;//частота
private char letter;//буква
private Node leftChild;//левый потомок
private Node rightChild;//правый потомок
public Node(char letter, int frequence) { //собственно, конструктор
this.letter = letter;
this.frequence = frequence;
}
public Node() {}//перегрузка конструтора для безымянных узлов(см. выше в разделе о построении дерева Хаффмана)
public void addChild(Node newNode) {//добавить потомка
if (leftChild == null)//если левый пустой=> правый тоже=> добавляем в левый
leftChild = newNode;
else {
if (leftChild.getFrequence() <= newNode.getFrequence()) //в общем, левым потомком
rightChild = newNode;//станет тот, у кого меньше частота
else {
rightChild = leftChild;
leftChild = newNode;
}
}
frequence += newNode.getFrequence();//итоговая частота
}
public Node getLeftChild() {
return leftChild;
}
public Node getRightChild() {
return rightChild;
}
public int getFrequence() {
return frequence;
}
public char getLetter() {
return letter;
}
public boolean isLeaf() {//проверка на лист
return leftChild == null && rightChild == null;
}
}
O lea la o le laau:
class BinaryTree {
private Node root;
public BinaryTree() {
root = new Node();
}
public BinaryTree(Node root) {
this.root = root;
}
public int getFrequence() {
return root.getFrequence();
}
public Node getRoot() {
return root;
}
}
Tulaga Fa'amuamua:
import java.util.ArrayList;//да-да, очередь будет на базе списка
class PriorityQueue {
private ArrayList<BinaryTree> data;//список очереди
private int nElems;//кол-во элементов в очереди
public PriorityQueue() {
data = new ArrayList<BinaryTree>();
nElems = 0;
}
public void insert(BinaryTree newTree) {//вставка
if (nElems == 0)
data.add(newTree);
else {
for (int i = 0; i < nElems; i++) {
if (data.get(i).getFrequence() > newTree.getFrequence()) {//если частота вставляемого дерева меньше
data.add(i, newTree);//чем част. текущего, то cдвигаем все деревья на позициях справа на 1 ячейку
break;//затем ставим новое дерево на позицию текущего
}
if (i == nElems - 1)
data.add(newTree);
}
}
nElems++;//увеличиваем кол-во элементов на 1
}
public BinaryTree remove() {//удаление из очереди
BinaryTree tmp = data.get(0);//копируем удаляемый элемент
data.remove(0);//собственно, удаляем
nElems--;//уменьшаем кол-во элементов на 1
return tmp;//возвращаем удаленный элемент(элемент с наименьшей частотой)
}
}
Le vasega e fatuina le laau Huffman:
public class HuffmanTree {
private final byte ENCODING_TABLE_SIZE = 127;//длина кодировочной таблицы
private String myString;//сообщение
private BinaryTree huffmanTree;//дерево Хаффмана
private int[] freqArray;//частотная таблица
private String[] encodingArray;//кодировочная таблица
//----------------constructor----------------------
public HuffmanTree(String newString) {
myString = newString;
freqArray = new int[ENCODING_TABLE_SIZE];
fillFrequenceArray();
huffmanTree = getHuffmanTree();
encodingArray = new String[ENCODING_TABLE_SIZE];
fillEncodingArray(huffmanTree.getRoot(), "", "");
}
//--------------------frequence array------------------------
private void fillFrequenceArray() {
for (int i = 0; i < myString.length(); i++) {
freqArray[(int)myString.charAt(i)]++;
}
}
public int[] getFrequenceArray() {
return freqArray;
}
//------------------------huffman tree creation------------------
private BinaryTree getHuffmanTree() {
PriorityQueue pq = new PriorityQueue();
//алгоритм описан выше
for (int i = 0; i < ENCODING_TABLE_SIZE; i++) {
if (freqArray[i] != 0) {//если символ существует в строке
Node newNode = new Node((char) i, freqArray[i]);//то создать для него Node
BinaryTree newTree = new BinaryTree(newNode);//а для Node создать BinaryTree
pq.insert(newTree);//вставить в очередь
}
}
while (true) {
BinaryTree tree1 = pq.remove();//извлечь из очереди первое дерево.
try {
BinaryTree tree2 = pq.remove();//извлечь из очереди второе дерево
Node newNode = new Node();//создать новый Node
newNode.addChild(tree1.getRoot());//сделать его потомками два извлеченных дерева
newNode.addChild(tree2.getRoot());
pq.insert(new BinaryTree(newNode);
} catch (IndexOutOfBoundsException e) {//осталось одно дерево в очереди
return tree1;
}
}
}
public BinaryTree getTree() {
return huffmanTree;
}
//-------------------encoding array------------------
void fillEncodingArray(Node node, String codeBefore, String direction) {//заполнить кодировочную таблицу
if (node.isLeaf()) {
encodingArray[(int)node.getLetter()] = codeBefore + direction;
} else {
fillEncodingArray(node.getLeftChild(), codeBefore + direction, "0");
fillEncodingArray(node.getRightChild(), codeBefore + direction, "1");
}
}
String[] getEncodingArray() {
return encodingArray;
}
public void displayEncodingArray() {//для отладки
fillEncodingArray(huffmanTree.getRoot(), "", "");
System.out.println("======================Encoding table====================");
for (int i = 0; i < ENCODING_TABLE_SIZE; i++) {
if (freqArray[i] != 0) {
System.out.print((char)i + " ");
System.out.println(encodingArray[i]);
}
}
System.out.println("========================================================");
}
//-----------------------------------------------------
String getOriginalString() {
return myString;
}
}
Vasega o lo'o i ai le fa'ailoga/decodes:
public class HuffmanOperator {
private final byte ENCODING_TABLE_SIZE = 127;//длина таблицы
private HuffmanTree mainHuffmanTree;//дерево Хаффмана (используется только для сжатия)
private String myString;//исходное сообщение
private int[] freqArray;//частотаная таблица
private String[] encodingArray;//кодировочная таблица
private double ratio;//коэффициент сжатия
public HuffmanOperator(HuffmanTree MainHuffmanTree) {//for compress
this.mainHuffmanTree = MainHuffmanTree;
myString = mainHuffmanTree.getOriginalString();
encodingArray = mainHuffmanTree.getEncodingArray();
freqArray = mainHuffmanTree.getFrequenceArray();
}
public HuffmanOperator() {}//for extract;
//---------------------------------------compression-----------------------------------------------------------
private String getCompressedString() {
String compressed = "";
String intermidiate = "";//промежуточная строка(без добавочных нулей)
//System.out.println("=============================Compression=======================");
//displayEncodingArray();
for (int i = 0; i < myString.length(); i++) {
intermidiate += encodingArray[myString.charAt(i)];
}
//Мы не можем писать бит в файл. Поэтому нужно сделать длину сообщения кратной 8=>
//нужно добавить нули в конец(можно 1, нет разницы)
byte counter = 0;//количество добавленных в конец нулей (байта в полне хватит: 0<=counter<8<127)
for (int length = intermidiate.length(), delta = 8 - length % 8;
counter < delta ; counter++) {//delta - количество добавленных нулей
intermidiate += "0";
}
//склеить кол-во добавочных нулей в бинарном предаствлении и промежуточную строку
compressed = String.format("%8s", Integer.toBinaryString(counter & 0xff)).replace(" ", "0") + intermidiate;
//идеализированный коэффициент
setCompressionRatio();
//System.out.println("===============================================================");
return compressed;
}
private void setCompressionRatio() {//посчитать идеализированный коэффициент
double sumA = 0, sumB = 0;//A-the original sum
for (int i = 0; i < ENCODING_TABLE_SIZE; i++) {
if (freqArray[i] != 0) {
sumA += 8 * freqArray[i];
sumB += encodingArray[i].length() * freqArray[i];
}
}
ratio = sumA / sumB;
}
public byte[] getBytedMsg() {//final compression
StringBuilder compressedString = new StringBuilder(getCompressedString());
byte[] compressedBytes = new byte[compressedString.length() / 8];
for (int i = 0; i < compressedBytes.length; i++) {
compressedBytes[i] = (byte) Integer.parseInt(compressedString.substring(i * 8, (i + 1) * 8), 2);
}
return compressedBytes;
}
//---------------------------------------end of compression----------------------------------------------------------------
//------------------------------------------------------------extract-----------------------------------------------------
public String extract(String compressed, String[] newEncodingArray) {
String decompressed = "";
String current = "";
String delta = "";
encodingArray = newEncodingArray;
//displayEncodingArray();
//получить кол-во вставленных нулей
for (int i = 0; i < 8; i++)
delta += compressed.charAt(i);
int ADDED_ZEROES = Integer.parseInt(delta, 2);
for (int i = 8, l = compressed.length() - ADDED_ZEROES; i < l; i++) {
//i = 8, т.к. первым байтом у нас идет кол-во вставленных нулей
current += compressed.charAt(i);
for (int j = 0; j < ENCODING_TABLE_SIZE; j++) {
if (current.equals(encodingArray[j])) {//если совпало
decompressed += (char)j;//то добавляем элемент
current = "";//и обнуляем текущую строку
}
}
}
return decompressed;
}
public String getEncodingTable() {
String enc = "";
for (int i = 0; i < encodingArray.length; i++) {
if (freqArray[i] != 0)
enc += (char)i + encodingArray[i] + 'n';
}
return enc;
}
public double getCompressionRatio() {
return ratio;
}
public void displayEncodingArray() {//для отладки
System.out.println("======================Encoding table====================");
for (int i = 0; i < ENCODING_TABLE_SIZE; i++) {
//if (freqArray[i] != 0) {
System.out.print((char)i + " ");
System.out.println(encodingArray[i]);
//}
}
System.out.println("========================================================");
}
}
O se vasega e faigofie ai ona tusi i se faila:
import java.io.File;
import java.io.PrintWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Closeable;
public class FileOutputHelper implements Closeable {
private File outputFile;
private FileOutputStream fileOutputStream;
public FileOutputHelper(File file) throws FileNotFoundException {
outputFile = file;
fileOutputStream = new FileOutputStream(outputFile);
}
public void writeByte(byte msg) throws IOException {
fileOutputStream.write(msg);
}
public void writeBytes(byte[] msg) throws IOException {
fileOutputStream.write(msg);
}
public void writeString(String msg) {
try (PrintWriter pw = new PrintWriter(outputFile)) {
pw.write(msg);
} catch (FileNotFoundException e) {
System.out.println("Неверный путь, или такого файла не существует!");
}
}
@Override
public void close() throws IOException {
fileOutputStream.close();
}
public void finalize() throws IOException {
close();
}
}
O se vasega e faafaigofie ai ona faitau mai se faila:
import java.io.FileInputStream;
import java.io.EOFException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
public class FileInputHelper implements Closeable {
private FileInputStream fileInputStream;
private BufferedReader fileBufferedReader;
public FileInputHelper(File file) throws IOException {
fileInputStream = new FileInputStream(file);
fileBufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
}
public byte readByte() throws IOException {
int cur = fileInputStream.read();
if (cur == -1)//если закончился файл
throw new EOFException();
return (byte)cur;
}
public String readLine() throws IOException {
return fileBufferedReader.readLine();
}
@Override
public void close() throws IOException{
fileInputStream.close();
}
}
Ia, ma le vasega autu:
import java.io.File;
import java.nio.charset.MalformedInputException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Paths;
import java.util.List;
import java.io.EOFException;
public class Main {
private static final byte ENCODING_TABLE_SIZE = 127;
public static void main(String[] args) throws IOException {
try {//указываем инструкцию с помощью аргументов командной строки
if (args[0].equals("--compress") || args[0].equals("-c"))
compress(args[1]);
else if ((args[0].equals("--extract") || args[0].equals("-x"))
&& (args[2].equals("--table") || args[2].equals("-t"))) {
extract(args[1], args[3]);
}
else
throw new IllegalArgumentException();
} catch (ArrayIndexOutOfBoundsException | IllegalArgumentException e) {
System.out.println("Неверный формат ввода аргументов ");
System.out.println("Читайте Readme.txt");
e.printStackTrace();
}
}
public static void compress(String stringPath) throws IOException {
List<String> stringList;
File inputFile = new File(stringPath);
String s = "";
File compressedFile, table;
try {
stringList = Files.readAllLines(Paths.get(inputFile.getAbsolutePath()));
} catch (NoSuchFileException e) {
System.out.println("Неверный путь, или такого файла не существует!");
return;
} catch (MalformedInputException e) {
System.out.println("Текущая кодировка файла не поддерживается");
return;
}
for (String item : stringList) {
s += item;
s += 'n';
}
HuffmanOperator operator = new HuffmanOperator(new HuffmanTree(s));
compressedFile = new File(inputFile.getAbsolutePath() + ".cpr");
compressedFile.createNewFile();
try (FileOutputHelper fo = new FileOutputHelper(compressedFile)) {
fo.writeBytes(operator.getBytedMsg());
}
//create file with encoding table:
table = new File(inputFile.getAbsolutePath() + ".table.txt");
table.createNewFile();
try (FileOutputHelper fo = new FileOutputHelper(table)) {
fo.writeString(operator.getEncodingTable());
}
System.out.println("Путь к сжатому файлу: " + compressedFile.getAbsolutePath());
System.out.println("Путь к кодировочной таблице " + table.getAbsolutePath());
System.out.println("Без таблицы файл будет невозможно извлечь!");
double idealRatio = Math.round(operator.getCompressionRatio() * 100) / (double) 100;//идеализированный коэффициент
double realRatio = Math.round((double) inputFile.length()
/ ((double) compressedFile.length() + (double) table.length()) * 100) / (double)100;//настоящий коэффициент
System.out.println("Идеализированный коэффициент сжатия равен " + idealRatio);
System.out.println("Коэффициент сжатия с учетом кодировочной таблицы " + realRatio);
}
public static void extract(String filePath, String tablePath) throws FileNotFoundException, IOException {
HuffmanOperator operator = new HuffmanOperator();
File compressedFile = new File(filePath),
tableFile = new File(tablePath),
extractedFile = new File(filePath + ".xtr");
String compressed = "";
String[] encodingArray = new String[ENCODING_TABLE_SIZE];
//read compressed file
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!check here:
try (FileInputHelper fi = new FileInputHelper(compressedFile)) {
byte b;
while (true) {
b = fi.readByte();//method returns EOFException
compressed += String.format("%8s", Integer.toBinaryString(b & 0xff)).replace(" ", "0");
}
} catch (EOFException e) {
}
//--------------------
//read encoding table:
try (FileInputHelper fi = new FileInputHelper(tableFile)) {
fi.readLine();//skip first empty string
encodingArray[(byte)'n'] = fi.readLine();//read code for 'n'
while (true) {
String s = fi.readLine();
if (s == null)
throw new EOFException();
encodingArray[(byte)s.charAt(0)] = s.substring(1, s.length());
}
} catch (EOFException ignore) {}
extractedFile.createNewFile();
//extract:
try (FileOutputHelper fo = new FileOutputHelper(extractedFile)) {
fo.writeString(operator.extract(compressed, encodingArray));
}
System.out.println("Путь к распакованному файлу " + extractedFile.getAbsolutePath());
}
}
E tatau ona e tusia le faila readme.txt oe lava :)
iʻuga
Ou te masalo na pau lava le mea sa ou manao e fai atu ai. Afai ei ai sau tala e uiga i loʻu le agavaa i le faʻaleleia o le code, algorithm, poʻo soʻo se faʻataʻitaʻiga lautele, ona e lagona le saoloto e tusi. Afai ou te le'i faamatalaina atu se mea, faamolemole tusi mai foi. Ou te fiafia e faʻalogo mai ia te oe i faʻamatalaga!
SALA
Ioe, ioe, o loʻo ou i ai pea iinei, aua e leʻi galo ia te aʻu le coefficient. Mo manoa s1, o le laulau fa'ailoga e 48 paita le mamafa - e sili atu le tele nai lo le faila faila, ma e le'i galo ia i matou le numera faaopoopo (o le numera o numera faaopoopo e 7) => o le fua fa'atatau o le a itiiti ifo i le tasi: 176/ (65 + 48*8 + 7) = 0.38. Afai na e matauina foi lenei mea, e le na o ou foliga e sili. Ioe, o lenei faʻatinoga o le a matua le aoga mo faila laiti. Ae o le a le mea e tupu i faila tetele? O le tele o faila e sili atu le lapopoa nai lo le lapopoa o le laulau fa'ailoga. O le mea lea e galue ai le algorithm e pei ona tatau ai! Mo se faataitaiga, mo
puna: www.habr.com