আপনার অসীম রৈখিক বাইনারি স্টোরেজ রয়েছে তা ধরে নিয়ে 0 থেকে অনন্ত পর্যন্ত পূর্ণসংখ্যা সংখ্যা উপস্থাপন করার জন্য একটি ভাল স্কিমা?


10

আমি কোনও সীমা ছাড়াই 0 দিয়ে শুরু করে পূর্ণসংখ্যা সংখ্যাগুলি উপস্থাপন করার জন্য একটি স্কিমা চাই (অসীম রৈখিক স্টোরেজে অ্যাক্সেস ধরে নিচ্ছি)।

এখানে একটি স্কিমা যা 0 থেকে 255 পর্যন্ত সংখ্যার প্রতিনিধিত্ব করতে পারে:

পূর্ণসংখ্যা সঞ্চয় করতে স্টোরেজের প্রথম বাইট (ঠিকানা 0) ব্যবহার করুন।

এখন, ধরুন আমি 255 এর চেয়ে বড় সংখ্যার প্রতিনিধিত্ব করতে চাই Of অবশ্যই, আমি পূর্ণসংখ্যাকে উপস্থাপন করতে 1 বাইটের বেশি ব্যবহার করতে পারি, তবে যতক্ষণ না এটি একটি নির্দিষ্ট সংখ্যা, অবশেষে একটি পূর্ণসংখ্যার এত বড় হবে যে এটি দ্বারা প্রতিনিধিত্ব করা যায় না মূল স্কিমা

এখানে আরও একটি স্কিমা যা কাজটি করতে সক্ষম হওয়া উচিত, তবে এটি সম্ভবত দক্ষ থেকে অনেক দূরে।

কেবল কোনও ধরণের অনন্য "সংখ্যার শেষ" বাইট ব্যবহার করুন, এবং সংখ্যাটি উপস্থাপন করতে পূর্ববর্তী সমস্ত বাইট ব্যবহার করুন। স্পষ্টতই, এই "সংখ্যার শেষ" বাইটটি সংখ্যার উপস্থাপনের যে কোনও জায়গায় ব্যবহার করা যায় না, তবে এটি বেস-255 (বেস -256 এর পরিবর্তে) নম্বর পদ্ধতি ব্যবহার করে অর্জন করা যেতে পারে।

তবে এটি ধীর এবং সম্ভবত অদক্ষ। আমি আরও ভাল একটি পেতে চাই যা কম মান এবং স্কেলগুলি দিয়ে আরও ভাল পারফর্ম করে।

মূলত, এটি একটি ইউইউডি সিস্টেম। আমি দেখতে চাই যে কোনও তাত্পর্যপূর্ণ ইউইউইডি সিস্টেম তৈরি করা সম্ভব যা তাত্ত্বিকভাবে কয়েক বছর ধরে, কয়েক হাজার বছর ধরে, কয়েক মিলিয়ন বছর ধরে ব্যবহার করতে স্কেল করতে পারে, আবার নতুন ডিজাইন করা ছাড়াই।


1
আপনি কি এমন কিছু চান যা অসীমভাবে স্কেল করতে পারে (যেমন আপনার প্রারম্ভের মতো), বা লক্ষ লক্ষ বছর ধরে (আপনার সমাপ্তির মতো)? দুটি প্রয়োজনীয়তা (স্পষ্টতই) সম্পূর্ণ আলাদা। একটি 64-বিট মেশিনে দু'বার পরিপূরক কয়েক মিলিয়ন বছর ধরে স্কেল করবে
ব্যবহারকারী16764

1
@ ইউজার ১64646464, আপনি কি একক 64৪-বিট পূর্ণসংখ্য পরিবর্তনশীল বলতে চান? এটি অবশ্যই কাজ করবে না: যদি 6 মিলিয়ন লোক প্রতি সেকেন্ডে 1 মিলিয়ন ইউইউডি ব্যবহার করে তবে তা সবেমাত্র এক মাসেরও বেশি স্থায়ী হয়।
দিমিত্রি শুরাল্যাভ

1
এবং 128-বিট মেশিনে এটি কতক্ষণ সময় নিতে পারে?
ব্যবহারকারী16764

2
আরএফসি 2550- এর ধারণাগুলি , যেগুলি বৃহত ধনাত্মক বৃহত পূর্ণসংখ্যার জন্য অভিধান সংক্রান্ত আদেশযুক্ত ASCII প্রতিনিধিত্ব করে, এটিকে মানিয়ে নিতে পারে। শেষ পর্যন্ত এটি একটি অ্যানারি বিভাগে ভেঙে যায় যা বেস -২ se সেগমেন্টের দৈর্ঘ্যকে এনকোড করে যে বেস -২ se সেগমেন্টের দৈর্ঘ্যকে এনকোড করে - পরের দুটি বেসটি স্কিমের মৌলিক কোনও কিছুর চেয়ে ASCII প্রতিনিধিত্বের সাথে আরও বেশি কাজ করে।
র্যান্ডম 832

1
ধরে নিচ্ছি যে আপনি ধারাবাহিকভাবে 128 বিট সংখ্যা উত্পন্ন করেছেন: আমরা যদি প্রতিটি মানুষকে পেটাফ্ল্যাপ-কম্পিউটার দিয়ে সমস্ত কম্পিউটারের গণনার ক্ষমতা উপরের দিকে আবদ্ধ করি, তবে এই সংখ্যাগুলি ফুরিয়ে যাওয়ার আগে 9 মিলিয়ন বছর সময় লাগবে। অন্যদিকে যদি প্রতিটি মানুষ এলোমেলোভাবে million০০ মিলিয়ন 128 বিট সংখ্যা উত্পন্ন করতে পারে তবে তাদের 1 টি নকল তৈরির 50% সুযোগ রয়েছে। যে আপনার জন্য যথেষ্ট ভাল? ( en.wikedia.org/wiki/Universally_unique_phanfier ) যদি না হয়, 256 বিট ব্যবহার করে এই উভয় চিত্রকে 2 ^ 128 = 3.4 * 10 ^ 38 দ্বারা গুণিত করে, যা সেকেন্ডে মহাবিশ্বের বর্গের চেয়ে বেশি হয়।
অ্যালেক্স দশ ব্রিংক

উত্তর:


13

আমি ব্যবহার করেছি এমন একটি পদ্ধতির: শীর্ষস্থানীয় 1 বিটের সংখ্যা গণনা করুন, বলুন n। সংখ্যার আকারটি তখন 2 ^ n বাইট হয় (অগ্রণী 1 বিট সহ)) পূর্ণসংখ্যার হিসাবে প্রথম 0 বিটের পরে বিটগুলি নিন এবং সর্বাধিক মান (প্লাস এক) যুক্ত করুন যা 2 enc (এন -1) বাইটে এই এনকোডিং ব্যবহার করে কোনও সংখ্যা দ্বারা প্রতিনিধিত্ব করা যেতে পারে।

সুতরাং,

                  0 = 0b00000000
                   ...
                127 = 0b01111111
                128 = 0b1000000000000000
                   ...
              16511 = 0b1011111111111111
              16512 = 0b11000000000000000000000000000000
                   ...
          536887423 = 0b11011111111111111111111111111111
          536887424 = 0b1110000000000000000000000000000000000000000000000000000000000000
                   ...
1152921505143734399 = 0b1110111111111111111111111111111111111111111111111111111111111111
1152921505143734400 = 0b111100000000000000000000000000000000000000000000 ...

এই স্কিমটি কোনও অ-নেতিবাচক মানকে ঠিক এক উপায়ে উপস্থাপন করার অনুমতি দেয়।

(সমানভাবে, শীর্ষস্থানীয় 0 বিটের সংখ্যা ব্যবহার করা হয়েছে))


1
কোন উত্তরটি গ্রহণযোগ্য হিসাবে চিহ্নিত করা হবে তা নির্ধারণ করা আমার পক্ষে কঠিন ছিল, কারণ আমি মনে করি তাদের মধ্যে অনেকগুলি খুব তথ্যপূর্ণ এবং ভাল। তবে আমি মনে করি যে আমি জিজ্ঞাসা করা প্রশ্নগুলির জন্য এটি সেরা ফিট (সম্ভবত আমার অন্তর্ভুক্ত অন্তর্ভুক্তটি নয়, যা প্রকাশ করা আরও শক্ত)।
দিমিত্রি শুরাল্যাভ

2
আমি উদাহরণ বাস্তবায়ন এবং নকশা বিবেচনা সহ আরও গভীরতর নিবন্ধ লিখেছি ।
20:55

10

আপনি যা করার চেষ্টা করছেন তার চারদিকে ভিত্তি করে একটি সম্পূর্ণ তত্ত্ব রয়েছে। সর্বজনীন কোডগুলি সম্পর্কে উইকি পৃষ্ঠাতে একবার দেখুন - পূর্ণসংখ্যার এনকোডিং পদ্ধতিগুলির (বরং কিছু বাস্তবে অনুশীলনে ব্যবহৃত হচ্ছে) এর সম্পূর্ণ তালিকা রয়েছে।

ডেটা সংকোচনে, পূর্ণসংখ্যার জন্য সর্বজনীন কোড হ'ল একটি উপসর্গ কোড যা বাইনারি কোডওয়ার্ডে ধনাত্মক পূর্ণসংখ্যার মানচিত্র করে

অথবা আপনি কয়েকটি ইউনিট (সম্ভবত বাইটস) সংখ্যাটির দৈর্ঘ্য সংরক্ষণ করার জন্য প্রথম 8 বাইট ব্যবহার করতে পারেন এবং তারপরে ডেটা বাইটগুলি রেখেছিলেন। এটি কার্যকর করা খুব সহজ হবে, তবে অল্প সংখ্যক জন্য অকার্যকর। এবং আপনি মানবতার জন্য উপলব্ধ সমস্ত ডেটা ড্রাইভ পূরণ করার জন্য দীর্ঘসংখ্যার কোডটি সক্ষম করতে সক্ষম হবেন :)


এর জন্য ধন্যবাদ, এটি খুব আকর্ষণীয়। আমি এটিকে গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করতে চেয়েছিলাম, তবে এটি ২ য় স্থান নিয়েছে। এটি একটি তাত্ত্বিক দৃষ্টিভঙ্গি, আইএমও থেকে খুব ভাল উত্তর।
দিমিত্রি শুরাল্যাভ

4

শীর্ষস্থানীয় 1 এর সংখ্যার তুলনায় বিটগুলিতে প্রথম 0 এর আকারের আকার (আকার আকার) হওয়া উচিত (নাম্বার আকার) How নামসাইজ একটি বাইনারি সংখ্যা যা আকার বিট সহ বাইটগুলিতে সংখ্যা উপস্থাপনের আকার দেয়। বাকী বিটগুলি বাইনারিতে সংখ্যা (সংখ্যা) হয়। ধনাত্মক পূর্ণসংখ্যার স্কিমের জন্য, এখানে কয়েকটি নমুনা উদাহরণ নম্বর রয়েছে:

Number              sizeSize  numSize    num
63:                 0 (1)     1 (1)      111111
1048575:            10 (2)    11 (3)     1111 11111111 11111111
1125899906842623:   110 (3)   111 (7)    11 11111111 11111111 11111111 11111111 11111111 11111111
5.19.. e+33:        1110 (4)  1111 (15)  11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

4

এটি সম্পর্কে: দৈর্ঘ্যের জন্য একটি বাইট, তারপরে সংখ্যাটির জন্য n বাইট (প্রথমে কমপক্ষে উল্লেখযোগ্য বাইট)। পূর্বের দৈর্ঘ্য 255 যতক্ষণ ছিল দৈর্ঘ্য + সংখ্যা পুনরাবৃত্তি করুন।

এটি নির্বিচারে বৃহত সংখ্যক জন্য অনুমতি দেয়, কিন্তু এখনও পরিচালনা করা সহজ এবং খুব বেশি স্মৃতি নষ্ট করে না।


fNek: উপরের সীমা নেই। উদাহরণস্বরূপ, সংখ্যার জন্য আপনার যদি 513 বাইটের প্রয়োজন হয় তবে বাইট ক্রমটি [255, বি0, ..., বি 255,255, বি 256, ..., বি 511,2, বি 512, বি 573]
ব্যবহারকারী 281377

দুঃখিত। আরও সাবধানে পড়া শিখতে হবে Should
fNek

3

কেন প্রতিটি বাইটের মধ্যে কেবল 7 টি বিট ব্যবহার করবেন না এবং 8 ম বিটটি ব্যবহার করার জন্য আরও একটি বাইট আছে কিনা তা বোঝাতে ব্যবহার করুন? সুতরাং 1-127 এক বাইটে থাকবে, 128 0x80 0x01 ইত্যাদি দ্বারা প্রতিনিধিত্ব করবে etc.


1
এই স্কিমটি প্রতি 8 বিটে মাত্র 128 টি মানকে এনকোড করে, যা প্রকৃতপক্ষে প্রশ্নকারীর দ্বারা প্রস্তাবিত দ্বিতীয় এনকোডিং স্কিমের চেয়ে কম স্থান দক্ষ, যেখানে প্রতি 8 বিটে 255 টি মান এনকোড করা হয়। উভয় স্কীম এ ভোগে যে আপনার এটি সঞ্চয় করার জন্য আপনার কতগুলি স্টোরেজ প্রয়োজন তা জানতে পুরো সংখ্যাটি পড়তে হবে।
মার্ক বুথ

3
সুতরাং এর একটি অনুলিপি তৈরি করতে আপনার দুবার নম্বর স্ক্যান করতে হবে, তবে কী? যদি আমি একটি অসীম সংখ্যার জন্য অপেক্ষা করতে পারি তবে আমি দুবার অপেক্ষা করতে পারি।
রাসেল বোরোগোভ

যদিও আমি এটি খুব সাবধানে উল্লেখ করেছি না, আমি এমন একটি সমাধান খুঁজছি যা যথাসম্ভব দক্ষতার সাথে সম্পাদন করবে (কেবলমাত্র প্রয়োজনীয়তার সাথে মেলে এমন সমাধানের পরিবর্তে; আমি ইতিমধ্যে আমার প্রশ্নের একটি সম্ভাব্য অদক্ষ উত্তর বর্ণনা করেছি)।
দিমিত্রি শুরাল্যাভ

3

ইউআইডি সিস্টেমগুলি সীমাবদ্ধ (তবে বৃহত্তর) মহাবিশ্বের সীমাবদ্ধ (তবে বৃহত) কম্পিউটিং পাওয়ারের উপর ভিত্তি করে। মহাবিশ্বের কণার সংখ্যার মতো অযৌক্তিকভাবে বড় জিনিসগুলির সাথে তুলনা করা হলেও ইউইউডিগুলির সংখ্যা বড়। যেকোন সংখ্যক স্থির বিট সহ ইউআইডি-র সংখ্যা, যদিও অনন্তের তুলনায় কম।

আপনার সংখ্যার পতাকাটির প্রান্তটি উপস্থাপন করতে 0xFFFF ব্যবহার করে সমস্যা হ'ল এটি সংখ্যা সংখ্যার বেশি হলে আপনার নম্বর এনকোডিংকে কম দক্ষ করে তোলে। তবে মনে হচ্ছে আপনার ইউইউডি স্কিমটি এই সমস্যাটিকে আরও ভয়াবহ করে তুলেছে। 256 বাইটের মধ্যে একটি বাদ না দিয়ে, আপনার এখন পুরো ইউইউডি স্থান নষ্ট হবে। গণনা / স্বীকৃতির দক্ষতা (স্থানের পরিবর্তে) আপনার তাত্ত্বিক কম্পিউটারের উপর অনেকটা নির্ভর করে (যা আমি মনে করি আপনি যদি অনন্তের কথা বলছেন)) কোনও টেপ এবং একটি সসীম রাষ্ট্র নিয়ামক সহ টিএম এর জন্য, কোনও ইউইউডি স্কিম দক্ষতার সাথে স্কেল করা অসম্ভব (মূলত, পাম্পিং লেমমা আপনাকে দক্ষতার সাথে একটি নির্দিষ্ট-বিট-দৈর্ঘ্যের শেষ চিহ্নিতকারীকে ছাড়িয়ে যেতে স্ক্রু করে)। আপনি যদি কোনও সসীম স্টেট কন্ট্রোলার না ধরে থাকেন তবে এটি প্রয়োগ নাও হতে পারে তবে বিডগুলি ডিকোডিং / স্বীকৃতি প্রক্রিয়ায় কোথায় যায় সে সম্পর্কে আপনাকে ভাবতে হবে।

আপনি যদি 256 বাইটের মধ্যে কেবল 1 এর চেয়ে ভাল দক্ষতা চান তবে আপনি নিজের ইউআইডি স্কিমের জন্য 1s এর বিট-দৈর্ঘ্য যা ব্যবহার করতে যাচ্ছেন তা ব্যবহার করতে পারেন। এটি অদক্ষতার 2 ^ বিট-দৈর্ঘ্যের মধ্যে 1।

মনে রাখবেন যে অন্যান্য এনকোডিং স্কিম রয়েছে, যদিও। ডিলিমিটারগুলির সাথে বাইট এনকোডিং কেবল কার্যকর করা সবচেয়ে সহজ হিসাবে ঘটে।


2

আমি বাইটের একটি অ্যারে (বা ইনট বা লম্বা) এবং একটি দৈর্ঘ্যের ক্ষেত্রের পরামর্শ দিচ্ছি যা বলবে যে সংখ্যাটি কত দীর্ঘ।

এটি জাভার বিগইন্টিজার দ্বারা প্রায় ব্যবহার করা পদ্ধতি । এর থেকে সম্ভাব্য ঠিকানা স্থানটি বিশাল - মহাবিশ্বের প্রতিটি পৃথক পরমাণুকে একটি আলাদা ইউআইডি দেওয়ার জন্য সহজেই যথেষ্ট :-)

অন্যথায় যদি আপনার কাছে করার খুব ভাল কারণ না থাকে তবে আমি কেবলমাত্র বিগইন্টিজার সরাসরি (বা অন্যান্য ভাষায় এর সমতুল্য) ব্যবহার করার পরামর্শ দেব বড় নম্বর হুইলটি পুনরায় উদ্ভাবনের জন্য বিশেষ কোনও প্রয়োজন নেই ....


ক্ষেত্রের সংখ্যা অসীম হতে পারে আপনি অ্যারের দৈর্ঘ্য এনকোড করতে পারবেন না।
স্লেভেক

আমি সম্মত হই যে প্রদত্ত সমস্যার জন্য একটি বিদ্যমান সমাধান (বিশেষত এমন একটি যা পেশাদার তদন্তের মাধ্যমে হয়েছে) ব্যবহার করা পছন্দনীয়, যখন সম্ভব হয়। ধন্যবাদ।
দিমিত্রি শুরাল্যাভ

@ স্লাভেক: সত্য, তবে ব্যবহারের ক্ষেত্রে ওপি বর্ণনা করছে (অর্থাত্ ইউইউডি), একটি বিগইন্টিজার কার্যকরভাবে অসীম। আপনি যে কোনও উপায়ে সীমাবদ্ধ মাপের মেমরির সাথে কোনও কম্পিউটারে সীমাহীন তথ্য এনকোড করতে পারবেন না, তাই বিগইন্টিজার আপনার অর্জনের সম্ভাব্য যে কোনও কিছুর মতোই দুর্দান্ত।
মাইকেরা

2

প্রথমত, আমার অপেক্ষাকৃত অস্পষ্ট এবং বিমূর্ত প্রশ্নটির দুর্দান্ত উত্তর দেওয়ার জন্য যারা ধন্যবাদ জানিয়েছেন তাদের সবাইকে ধন্যবাদ।

অন্যান্য উত্তর সম্পর্কে চিন্তা করার পরে আমি একটি সম্ভাব্য উত্তরটি অবদান রাখতে চাই। এটি জিজ্ঞাসা করা প্রশ্নের সরাসরি উত্তর নয়, তবে এটি প্রাসঙ্গিক।

কিছু লোক যেমন উল্লেখ করেছে, 64/128/256 বিট আকারের একটি পূর্ণসংখ্যা ব্যবহার ইতিমধ্যে আপনাকে ইউআইডিগুলির জন্য খুব বড় জায়গা দেয়। স্পষ্টতই এটি অসীম নয়, তবে ...

সম্ভবত fixed৪-বিট পর্যাপ্ত না হওয়া পর্যন্ত (বা এটির কাছাকাছি) অবধি কেবলমাত্র একটি নির্দিষ্ট আকারের ইনট (বলুন, শুরু করতে 64৪-বিট) ব্যবহার করা ভাল ধারণা হতে পারে। তারপরে, ধরে নিই যে ইউইউডিগুলির পূর্ববর্তী সমস্ত দৃষ্টান্তগুলিতে আপনার যেমন অ্যাক্সেস রয়েছে, কেবল সেগুলি 128-বিট ইনটগুলিতে আপগ্রেড করুন এবং এটিকে আপনার পূর্ণসংখ্যার স্থির আকার হিসাবে নিয়ে যান।

যদি সিস্টেমটি এই ধরণের বিরতি / পরিষেবার বাধা দেয় এবং এই জাতীয় "পুনর্নির্মাণ" অপারেশনগুলি খুব কম সময়ে ঘটে থাকে তবে সম্ভবত সুবিধাগুলি (একটি খুব সাধারণ, দ্রুত, কার্যকর পদ্ধতি কার্যকর করার পদ্ধতি) অসুবিধাগুলি কাটিয়ে উঠবে (পূর্বে বরাদ্দকৃত সমস্ত পূর্ণসংখ্যার পুনর্নির্মাণের জন্য) একটি নতুন পূর্ণসংখ্যার বিট আকারে)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.