Skip to main content

ტრანსფორმაცია წინ გადმოტანით

Move-To-Front Transform

        ტრანსფორმაციის ეს მეთოდი(MTF) თავის მხრივ არ წარმოადგენს მონაცემთა შეკუმშვის მეთოდს, თუმცა ის გამოიყენება ენტროპიული კოდირებისას როგორც წინასწარი ტრანსფორმაციის მეთოდი. მისი მიზანია შეამციროს მონაცემთა გაბნევის მაჩვენებელი რათა გაიზარდოს ენტროპიული კოდირებისას შეკუმშვის ხარისხი.
        მისი მუშაობის პრინციპი შემდეგია: ვთქვათ გვაქვს შემომავალი ელემენტების შესაძლო მნიშვნელობების სია წინასწარ განსაზღვრული, რომელშის თითოეულ სიმბოლოს გააჩნია ინდექსი. ალგორითმის მუშაობის პრინციპი შემდეგია: ვატრიალებთ ციკლს სანამ სიმბოლოების შემავალი მიმდევრობა ცარიელი არაა და ყოველ ეტაპზე ვასრულებთ შემდეგს.
  1. სიმბოლოების შემავალი მიმდევრობიდან ამოვაგდებთ პირველ ელემენტს, ვპოულობთ მისი მნიშვნელობის მქონე ელემენტს შესაძლო მნიშვნელობათა მიმდევრობაში, მის მიმდინარე ინდექსს ვწერთ გამომავალი მიმდევრობის ბოლოში.
  2. შესაძლო მნიშვნელობების სიიდან ამოვაგდებთ ნაპოვნ ელემენტს და გადავიტანთ ამავე სიის თავში.
ქვემოთ მოცემულ ცხრილში ნაჩვენებია შემავალი, გამომავალი და შესაზძლო მნიშვნელობების მიმდევრობები ალგორითმის მუშაობის პროცესში სადაც ვახდენთ "bananaaa" სიმბოლოების მიმდევრობის ტრანსფორმაციას.

შემავალიგამომავალიშესაძლო მნიშვნელობების სია
bananaaa1abcdefghijklmnopqrstuvwxyz
ananaaa1,1bacdefghijklmnopqrstuvwxyz
nanaaa1,1,13abcdefghijklmnopqrstuvwxyz
anaaa1,1,13,1nabcdefghijklmopqrstuvwxyz
naaa1,1,13,1,1anbcdefghijklmopqrstuvwxyz
aaa1,1,13,1,1,1nabcdefghijklmopqrstuvwxyz
aa1,1,13,1,1,1,0anbcdefghijklmopqrstuvwxyz
a1,1,13,1,1,1,0,0anbcdefghijklmopqrstuvwxyz
Final1,1,13,1,1,1,0,0
anbcdefghijklmopqrstuvwxyz
დეკოდირების პროცესი მუშაობს კოდირების მსგავსად, იმ განსხვავებით რომ თუ კოდირებისას ჩვენ ვეძებდით ანბანში სიმბოლოს შესაბამის ინდექსს, ახლა უნდა მოვძებნოთ ინდექსის შესაბამისი სიმბოლო.

იმპლემენტაციის დეტალები
        საილუსტრაციოთ მოვიყვანოთ პროგრამული კოდი რომელიც დაწერილია C++-ზე.


#pragma once

class MTF
{
public:
  MTF(){}
  ~MTF(){}

  bool encode( unsigned char* DataIn, unsigned int sizeIn, unsigned char*& DataOut );
  bool decode( unsigned char* DataIn, unsigned int sizeIn, unsigned char*& DataOut );

private:
  int GetSymbolIndex( unsigned char* alphabet, unsigned char symbol );
  void MoveToFront( unsigned char* alphabet, unsigned char symbolIndex );
};




#include <memory.h>
#include "MTF.h"

bool MTF::encode( unsigned char* DataIn, unsigned int sizeIn, unsigned char*& DataOut )
{
  unsigned char alphabet[ 256 ];
  for( int i=0; i<256; i++ )
  alphabet] = i;

  DataOut = new unsigned charsizeIn ];
  if( !DataOut )
  return false;

  for( unsigned int i=0; i<sizeIn; i++ )
  MoveToFront( alphabet, DataOut] = GetSymbolIndex( alphabet, DataIn] ) );

  return true;
}

bool MTF::decode( unsigned char* DataIn, unsigned int sizeIn, unsigned char*& DataOut )
{
  unsigned char alphabet[ 256 ];
  for( int i=0; i<256; i++ )
     alphabet] = i;

  DataOut = new unsigned char[ sizeIn ];
  if( !DataOut )
     return false;

  for( unsigned int i=0; i<sizeIn; i++ )
  {
     DataOut[ i ] = alphabet[ DataIn[ i ] ];
     MoveToFront( alphabet, DataIn[ i ] );
  }

  return true;
}

inline int MTF::GetSymbolIndex( unsigned char* alphabet, unsigned char symbol )
{
  for( int i=0; i<256; i++ )
     if( alphabet] == symbol )
        return i;

  //ანბანი დაზიანებულია
  return -1;
}

inline void MTF::MoveToFront( unsigned char* alphabet, unsigned char symbolIndex )
{
  unsigned char c = alphabetsymbolIndex ];
  memcpy( alphabet+1, alphabet, symbolIndex );
  alphabet[ 0 ] = c;
}

        არაპრაქტიკულია შესაძლო მნიშვნელობათა სიის შენახვა მასივის სახით რადგან წინ გადმოტანის პროცესი მოითხოვს მასივის ელემენტების ჩაჩოჩებას. უფრო კარგი იქნება თუ გამოვიყენებთ ბმულ სიებს ან ბალანსირებულ ორობით ხეებს.

Comments

Popular posts from this blog

ფერების RGB მოდელი

RGB Color Model         ფერების RGB მოდელი წარმოადგენს ისეთ მოდელს რომელშიც სამი ძრირითადი ფერის წითელი, მწვანე და ლურჯის საშუალებით მიიღება ფერების ფართო სპექტრი. მისი დასახელებაც მოდის სწორედ ძირითადი ფერების ინგლისური სახელწოდების ინიციალებიდან(Red, Green, Blue).         ფერთა სპექტრის ამდაგვარი წარმოდგენა დაკავშირებულია იმასთან, რომ გამოსახულების გამოტანის მოწყობილობებში რომელიც გააჩნიათ კომპიუტერებს, ტელევიზორებს ფერის მიღება ფიზიკურად ხდება სწორედ ამ სამი ძირითადი ფერის შეზავებით. დღესდღეობით ყველაზე გავრცელებული არის 24 ბიტიანი RGB მოდელი, სადაც თითოეულ კომპონენტს ეთმობა ერთი ბაიტი და შესაბამისად შეუძლია მიიღოს ნებისმიერი მნიშვნელობა [0, 255] დიაპაზონში, რაც საბოლოოდ გვაძლევს 16777216 განსხვავებულ ფერს.

სინათლის ხილული სპექტრი და სხივის თვისებები

Visible Spectrum სურათზე ნაჩვენებია პრიზმაში გამავალი თეთრი სხივის სპექტრულად გაშლის პროცესი.         სინათლე წარმოადგენს ელექტრომაგნიტურ ტალღას, რომელსაც როგორც ყველა ელექტრომაგნიტურ ტალღას გააჩნია რამოდენიმე მნიშვნელოვანი მახასიათებელი. ერთერთი მნიშვნელოვანი მახასიათებელი არის ტალღის სიგრძე, რომელიც განსაზღვრავს სხივის სპექტრულ ფერს. ელექტრომაგნიტური ტალღები ბუნებაში და თანამედროვე სამყაროში მრავლად გვხვდები. სხვადასხვა ტალთის სიგრძის(სიხშირის) ტალღებს იყენებენ როგორც საყოფაცხოვრებო(რადიო, მობილური ტელეფონი) დანიშნულების, ასევე სამედიცინო(რენდგენის სხივები) და სამხედრო(რადარები) მოწყობილობებში. ადამიანის თვალისთვის ხილული სინათლის ელექტრომაგნიტური ტალღების ტალღის სიგრძე იწყება დაახლოებით 400 ნანომეტრიდან და მთავრდება 700 ნანომეტრზე. ამ დიაპაზონს ქვემოთ ექცევა ულტრაიისფერი ტალღები და დიაპაზონს ზემოთ ექცევა ინფრაწითელი, რომელსაც ადამიანის თვალი ვერ აღიქვამს(იხილეთ ქვემოთ მოცემული სურათი). სინათლის თეთრი სხივი შედგება სხვადასხვა სიხშირის ტალღების ერთობლიობისგან.        

CPU GPU და ჰიბრიდული რენდერერები

წყარო         დღემდე აქტუალურია თემა CPU რენდერერი ჯობია თუ GPU . იმისათვის რომ ამ კითხვას მეტნაკლებად ამომწურავი პასუხი გავცეთ განვიხილოთ რენდერერის სტრუქტურა და მოცემულ პლათფორმებზე იპმლემენტაციასთან დაკავშირებული პრობლემები. რენდერერი შედგება რამოდენიმე დიდი კომპონენტისგან როგორიცაა ხილვადობის ამოცანა შეფერადება ინტეგრატორები ფუნქციონალი ხილვადობის ამოცანა         ხილვადობის ამოცანა ერთერთი ყველაზე რთულია გამოთვლითი რესურსის კუთხით. გარდა იმისა, რომ სხივის გეომეტრიასთან თანაკვეთის დათვლას საკმაოდ დიდი დრო ჭირდება, ასევე საჭიროა ამაჩქარებელ სტრუქტურების განახლება კადრიდან კადრზე დინამიური სცენებისათვის. კარგი ისაა, რომ რენდერერის ეს ნაწილი საკმაოდ ადვილად ენკაპსულირებადია და შესაბამისად გვხვდება ბიბლიოთეკები მაგალითად embree(intel), fireRays(AMD), OptiX prime(nvidia), ... რომლებიც ამ ამოცანას საკმაოდ ეფექტურად ხსნიან და რენდერერებშიც მეტნაკლებად ადვილად ინტეგრირდებიან.  სხივების მიდევნების პროცესში ძალიან მნიშვნელოვანია მსგავსი გამოთვლების ლოკალიზება და არსებული SIMD