الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

محاولة في كتابة خوارزمية ضغط لحجم النصوص

بدأه yahya91 في 8 أغسطس 2010 · 2 رد · 904 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لقد قرأت عن آلية ضغط النصوص و هي طبعاً أكثر من آلية :

* آلية تتبع البتات المتشابهة المتتالية و ترميزها برمز معين و استخدام هذا الرمز بدل عنها

* آلية تتبع الأحرف المتشابهة و ترميز كل حرف مكرر أكثر من مرة برمز معين و استخدامه بدل التكرار

*انشاء آلية تخزين جديدة :مثل تقليل عدد بيتات المحرف و يمكنكم مراجعة الملف الذي أرفقته و الذي تكلم عن ضغط البيانات

الكود الذي أحاول كتابه (و الذي لم ينتهي بعد ) يحاكي الطريقة الثانية :

حيث سأقوم بمقارنة كل حرف مدخل عبر سلسلة مع باقي الأحرف فإن حصل التشابه أكثر من مرة خزنت هذا الحرف في مصفوفة جديدة خاصة بالأحرف المكررة أكثر من مرة ثم سأقوم بعملية delete للعنصر المكرر و الإستعاضة عنده بالرمز الخاص بالحرف المكرر لذلك قمت بتحويل الstring إلى pointers لكي أستطيع الحذف :

المهم هذا الجزء الأول من الكود الخاص بالبحث عن الأحرف المتشابهة (أعلم أنه بسيط و لكن لا أحصل على النتيجة الصحيحة ) فما المشكلة فيه :

#include<iostream>
#include<string>
using namespace std;
int main()
{
std::string text ;
cout<<"enter you text here"<<endl;
cin>>text;
int k=0,n=0;//for 'loops' looks down
char * can_compress;char * str;//can_compress is an array of character that repeated more than one 
                                       // str for new                                     
can_compress= new char[text.length()];
str=new char[text.length()];
for(int o=0;o<text.length();o++)
{
        str[o]=text[o];
        }

for(int i=0;i<text.length();i++)
{           //#.1
for(int j=i+1;j<text.length();j++)
{            //#.2
        if(text==text[j])
        k++;
        }    //end of #.2
        if(k>1)//if the character is repeated more than one then we will compress it.
        {
        can_compress[n]=text;
        n++;//to next index
        }
        k=0;
                }// end of #.1
        cout<<"the characters are"<<endl;
        for(int m=0;m<strlen(can_compress);m++)
        {
                cout<<can_compress[m];
                }
                for(int h=0;h<strlen(str);h++)
				{
					for(int p=0;p<strlen(can_compress);p++)
					if(str[h]==can_compressبسم الله الرحمن الرحيم)
						delete str[h];
				}
				cout<<"string would bee after compressing"<<str<<endl;
                return 0;
                }

المشكلة في التحديد أن بعض الأحيات يعملو الأخرى لا شاهد هذه المحاولتين(دون فقرة حذف الحرف المكرر) :

المحاولة الأولى(ناجحة):

enter you text here

arabteam-2000

the characters are

a0

المحاولة الثانية (فاشلة):

enter you text here

arabteam is a great forum

the characters are

a═══════²²²²◄‼@

و بعد ما أضفت الجزء المتعلق بحذف العنصر المكرر تمهيدا إلى استبداله بالرمز

قال الكومبايلر:

cannot delete objects that are not pointers

مع أي استخدم الnew و هي من صلب المؤشرات

Data Compression and Huffman Encoding.pdf

تم تعديل هذه المشاركة بواسطة yahya91 في 8 أغسطس 2010 في 22:00

#2

بصراحة

أنا أيضاً بحاجة ماسة إلى الكود

طلبه مني أحد الأشخاص البارحة

وررته خائباً للأسف .. ربما لأنني لم أدرس الخوارزميات بعد

لذا إن أتى به أحد الزملاء بسرعة أكن له من الشاكرين ..

خصوصاً إذا كنا نتحدث عن :

Adaptive Huffman Encoding

البرمجة = الرياضيات

#3

صراحة أنا لم أدرس الخوارزميات بعد أيضاً-هذه السنة إن شاء الله - و لكن أستطيع أن أعطيك رابط صفحة فيه كود لخوارزمية تعتمد على الطريقة الأولى التي تحدثت عنها في الضغط و البرنامج مكتوب بلغة ال سي

http://unicode.org/notes/tn31/

مواضيع مشابهة