আমি ছোট টেক্সট স্ট্রিংগুলি সঙ্কুচিত করতে একটি অ্যালগরিদম সন্ধান করছি: 50-1000 বাইট (অর্থাত্ ইউআরএল)। এর জন্য কোন অ্যালগরিদম সবচেয়ে ভাল কাজ করে?
tinyurls
বা স্টোরেজ স্পেসের সাথে কিছু করার আছে?
আমি ছোট টেক্সট স্ট্রিংগুলি সঙ্কুচিত করতে একটি অ্যালগরিদম সন্ধান করছি: 50-1000 বাইট (অর্থাত্ ইউআরএল)। এর জন্য কোন অ্যালগরিদম সবচেয়ে ভাল কাজ করে?
tinyurls
বা স্টোরেজ স্পেসের সাথে কিছু করার আছে?
উত্তর:
পরীক্ষা করে দেখুন Smaz :
স্মাজ খুব সহজ সংক্ষিপ্ত স্ট্রিং সংক্ষেপণের জন্য উপযুক্ত একটি সাধারণ সংক্ষেপণ গ্রন্থাগার।
string:orig_size:compr_size:space_savings
) This is the very end of it.:27:13:52%
, Lorem ipsum dolor sit amet:26:19:27%
, Llanfairpwllgwyngyll:20:17:15%
, aaaaaaaaaaaaa:13:13:0%
, 2BTWm6WcK9AqTU:14:20:-43%
,XXX:3:5:-67%
হাফম্যানের একটি স্ট্যাটিক ব্যয় রয়েছে, হাফম্যান টেবিল, তাই আমি এটি একটি ভাল পছন্দের সাথে একমত নই।
অভিযোজিত সংস্করণগুলি রয়েছে যা এটিকে সরিয়ে দেয় তবে সংক্ষেপণের হারটি ভুগতে পারে। আসলে, আপনার যে প্রশ্নটি জিজ্ঞাসা করা উচিত তা হ'ল "এই বৈশিষ্ট্যগুলির সাথে টেক্সট স্ট্রিংগুলি সংকোচন করার জন্য কি অ্যালগরিদম"। উদাহরণস্বরূপ, যদি দীর্ঘ পুনরাবৃত্তি প্রত্যাশিত হয় তবে সহজ রান-লেং এনকোডিং যথেষ্ট be যদি আপনি গ্যারান্টি দিতে পারেন যে কেবলমাত্র ইংরেজী শব্দ, ফাঁকা স্থান, যোজনা এবং মাঝে মাঝে অঙ্কগুলি উপস্থিত থাকবে, তবে পূর্ব নির্ধারিত হাফম্যান টেবিলযুক্ত হাফম্যান ভাল ফল দিতে পারে।
সাধারণত, লেম্পেল-জিভ পরিবারের আলগোরিদিমগুলির মধ্যে খুব ভাল সংকোচনের ও কর্মক্ষমতা থাকে এবং তাদের জন্য প্রচুর গ্রন্থাগার রয়েছে। আমি সাথে যেতে হবে।
সংকুচিত হচ্ছে এমন তথ্যগুলি ইউআরএল রয়েছে, তারপরে আমি পরামর্শ দিয়েছিলাম যে, সংকোচন করার আগে (যে কোনও অ্যালগোরিদম সহজেই পাওয়া যায়) এর সাথে আপনি এগুলি সংরক্ষণ করুন। ইউআরএলগুলি সু-সংজ্ঞায়িত নিদর্শনগুলি অনুসরণ করে এবং এর কিছু অংশ অত্যন্ত অনুমানযোগ্য। এই জ্ঞানটি ব্যবহার করে আপনি URL গুলিকে ছোট ছোট কিছুতে কোড করতে পারেন এবং হাফম্যান এনকোডিংয়ের পিছনে ধারণাগুলি আপনাকে এখানে সহায়তা করতে পারে।
উদাহরণস্বরূপ, ইউআরএলটিকে কিছুটা স্ট্রিমে অনুবাদ করে আপনি "HTTP" কে বিট 1 এর সাথে এবং বিট "0" এর সাথে অন্য কোনও কিছুর পরিবর্তে প্রকৃত প্রোটোটল (বা অন্য সাধারণ প্রোটোকল পেতে https, এফটিপি, ফাইল)। যতক্ষণ আপনি প্রোটোকলের শেষ চিহ্নিত করতে পারেন ততক্ষণ ": //" পুরোপুরি ফেলে দেওয়া যেতে পারে। ইত্যাদি ইউআরএল ফর্ম্যাট সম্পর্কে পড়ুন, এবং কীভাবে কম স্থান নেওয়ার জন্য তাদের কোডিং করা যায় তা চিন্তা করুন।
আমার হাতে দেওয়ার কোড নেই তবে আমি সর্বদা আকারের 256 * 256 অক্ষরের 2D লুক টেবিল ( আরএফসি 1978 , পিপিপি প্রেডিক্টর সংক্ষেপণ প্রোটোকল ) তৈরির পদ্ধতির পছন্দ করি liked একটি স্ট্রিং সংকোচনের জন্য আপনি প্রতিটি চরের উপর লুপ করেন এবং সারণীতে সূচক হিসাবে বর্তমান এবং পূর্ববর্তী চরটি ব্যবহার করে পরবর্তী চরটি 'ভবিষ্যদ্বাণী করা' পেতে পেতে সারণীটি ব্যবহার করুন। যদি কোনও মিল থাকে তবে আপনি একক 1 বিট লিখুন, অন্যথায় একটি 0 লিখুন এবং বর্তমানের চরটি দিয়ে অনুসন্ধান সারণীটি আপডেট করুন। এই পদ্ধতিটি মূলত ডেটা স্ট্রিমের সবচেয়ে সম্ভাব্য পরবর্তী অক্ষরের একটি গতিশীল (এবং অপরিশোধিত) দেখার সারণি বজায় রাখে।
আপনি একটি শূন্য অনুসন্ধানের টেবিল দিয়ে শুরু করতে পারেন, তবে প্রতিটি অক্ষরের জুটির সর্বাধিক সম্ভাব্য চরিত্রের সাহায্যে এটি প্রাথমিকভাবে শুরু করা হলে উদাহরণস্বরূপ, ইংরেজি ভাষার জন্য এটি খুব ছোট স্ট্রিংয়ে সবচেয়ে ভাল কাজ করে। সংক্ষিপ্ত বিবরণ এবং ডিকম্প্রেশন জন্য প্রাথমিক লুক টেবিলটি সমান হওয়ায় আপনার এটি সংকোচিত ডেটাতে বের করার প্রয়োজন হবে না।
এই অ্যালগরিদম একটি উজ্জ্বল সংকোচনের অনুপাত দেয় না, তবে এটি মেমরি এবং সিপিইউ সংস্থানগুলির সাথে অবিশ্বাস্যরূপে সাফল্যযুক্ত এবং ডেটার অবিচ্ছিন্ন প্রবাহেও কাজ করতে পারে - ডিকম্প্রেসারটি লকপ্রেসগুলির সাথে লকিং টেবিলের নিজস্ব অনুলিপি বজায় রাখে, এইভাবে অনুসন্ধান সারণী সংকোচিত হওয়ার ধরণের ডেটার সাথে সামঞ্জস্য।
যে কোনও অ্যালগরিদম / লাইব্রেরি যা প্রিসেট ডিকশনারি সমর্থন করে, যেমন zlib ।
এইভাবে আপনি একই ধরণের পাঠ্য দিয়ে সংকোচকারীকে প্রাইম করতে পারেন যা ইনপুটটিতে প্রদর্শিত হতে পারে। যদি ফাইলগুলি কোনও উপায়ে একই রকম হয় (যেমন সমস্ত ইউআরএল, সমস্ত সি প্রোগ্রাম, সমস্ত স্ট্যাকওভারফ্লো পোস্ট, সমস্ত এএসসিআইআই-আর্ট অঙ্কন) তবে নির্দিষ্ট কিছু সাবস্ট্রিংগুলি বেশিরভাগ বা সমস্ত ইনপুট ফাইলগুলিতে প্রদর্শিত হবে।
প্রতিটি সংক্ষেপণ অ্যালগরিদম স্থান সংরক্ষণ করবে যদি একই ইনস্ট্রিংটি কোনও ইনপুট ফাইলে একাধিকবার পুনরাবৃত্তি করা হয় (যেমন "ইংরেজী পাঠ্যে" "" বা সি কোডে "ইনট"))
তবে ইউআরএলগুলির ক্ষেত্রে কিছু স্ট্রিং (যেমন " http: // www ।", ".কম", ".এইচটিএমএল", ".এএসপিএক্স") প্রতিটি ইনপুট ফাইলে সাধারণত উপস্থিত হবে So সুতরাং আপনাকে সেগুলি ফাইলগুলির মধ্যে ভাগ করে নেওয়া দরকার ফাইলের জন্য কোনওরকম সংকোচিত ঘটনা না ঘটানোর পরিবর্তে এগুলি একটি প্রিসেট অভিধানে রাখলে এটি অর্জন করবে।
হাফম্যান কোডিং এর জন্য সাধারণত কাজ করে।
আপনি যদি কেবল পাঠ্যকে সংক্ষিপ্ত করার বিষয়ে কথা বলছেন তবে ডিফল্ট / জিজিপ (জিজিপের চারপাশে মোড়ক), ছোট ফাইল এবং পাঠ্যের জন্য জিপ ভালভাবে কাজ করবে। অন্যান্য অ্যালগরিদম বড় আকারের ফাইলগুলির জন্য যেমন bzip2 ইত্যাদির জন্য অত্যন্ত দক্ষ are
উইকিপিডিয়ায় সংকোচনের সময়ের একটি তালিকা রয়েছে। (দক্ষতার তুলনা দেখুন)
Name | Text | Binaries | Raw images
-----------+--------------+---------------+-------------
7-zip | 19% in 18.8s | 27% in 59.6s | 50% in 36.4s
bzip2 | 20% in 4.7s | 37% in 32.8s | 51% in 20.0s
rar (2.01) | 23% in 30.0s | 36% in 275.4s | 58% in 52.7s
advzip | 24% in 21.1s | 37% in 70.6s | 57& in 41.6s
gzip | 25% in 4.2s | 39% in 23.1s | 60% in 5.4s
zip | 25% in 4.3s | 39% in 23.3s | 60% in 5.7s
আপনি ইউনিকোডের জন্য স্ট্যান্ডার্ড সংক্ষেপণ স্কিমটি একবার দেখে নিতে পারেন ।
এসকিউএল সার্ভার ২০০৮ আর 2 এটি অভ্যন্তরীণভাবে ব্যবহার করে এবং 50% পর্যন্ত সংক্ষেপণ অর্জন করতে পারে।