কনস্ট্যান্ট টাইম এবং ইমোর্টাইজড কনস্ট্যান্ট টাইম কার্যকরভাবে সমতুল্য হিসাবে বিবেচিত হয়?


16

আমার একটি র‌্যান্ডম কিউ লিখতে হবে যা কনস্ট্যান্ট টাইমে (ও (1)) এম্পেন্ডস এবং এলোমেলো অপসারণের অনুমতি দেয়।

আমার প্রথম চিন্তাটি এটিকে কোনও প্রকার অ্যারে (আমি একটি অ্যারেলিস্ট চয়ন করেছি) দিয়ে ফিরে আসার কথা ছিল, যেহেতু অ্যারেগুলির একটি সূচকের মাধ্যমে অবিচ্ছিন্ন অ্যাক্সেস থাকে।

যদিও ডকুমেন্টেশনটি অনুসন্ধান করে, আমি বুঝতে পেরেছি যে অ্যারেলিস্টগুলির সংযোজনগুলি নিয়মিত সময় হিসাবে গণ্য করা হয়েছে, কারণ এটি সংযোজনকে অন্তর্নিহিত অ্যারে পুনর্নির্মাণের প্রয়োজন হতে পারে, যা হ'ল (এন)।

কি ইমোরাইজড কনস্ট্যান্ট টাইম এবং কনস্ট্যান্ট টাইম কার্যকরভাবে একই রকম, বা আমার কোনও কাঠামোর দিকে নজর দেওয়া দরকার যে প্রতিটি সংযোজনে সম্পূর্ণ পুনর্নির্মাণের প্রয়োজন হয় না?

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

  • যে কোনও গাছের ভিত্তিতে সর্বোত্তম ও (লগ এন) অ্যাক্সেস থাকবে
  • একটি লিঙ্কযুক্ত তালিকায় O (1) সংযোজনগুলি থাকতে পারে (যদি পুচ্ছের একটি রেফারেন্স রাখা হয়) তবে এলোমেলো অপসারণটি সর্বোত্তম O (n) হওয়া উচিত।

এখানে সম্পূর্ণ প্রশ্ন; যদি আমি কিছু গুরুত্বপূর্ণ বিবরণ দেখেছি:

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


অ্যাসাইনমেন্টটি কীভাবে এলোমেলোভাবে অপসারণ সম্পাদন করা হবে তা নির্দিষ্ট করে? আপনি কি সরানোর জন্য একটি সূচক দেওয়া বা একটি সারি উপাদান একটি রেফারেন্স দেওয়া হয়েছে?

এটি কোনও নির্দিষ্ট বিবরণ দেয় না। প্রয়োজনীয়তাগুলি কেবল একটি কাঠামো যা ক্যু ইন্টারফেস প্রয়োগ করে এবং এতে ও (1) সংযোজন এবং অপসারণ রয়েছে।
কারসিজিনিট

একদিকে যেমন - ও (এন) ক্রমবর্ধমান একটি পুনরায় আকারযুক্ত অ্যারেতে অগত্যা ও (1) সংযোজন নেই: এটি কীভাবে অ্যারে বাড়ায় তার উপর নির্ভর করে । একটি ধ্রুবক পরিমাণ দ্বারা ক্রমবর্ধমান একটি এখনও হে (ঢ) হয় উপরন্তু জন্য (আমরা একটি আছে 1/aএকটি হে (ঢ) অপারেশন জন্য সুযোগ), কিন্তু একটি ধ্রুবক গুণক দ্বারা ক্রমবর্ধমান a > 1হে (1) উপরন্তু জন্য amortized: আমরা একটি আছে (1/a)^nক্ষেত্রের একটি হে রয়েছে সম্ভাবনা (এন) অপারেশন, তবে সেই সম্ভাবনাটি বৃহত্তর শূন্যের কাছে পৌঁছে n
আমন

অ্যারেলিস্টগুলি কি পরেরটি সঠিক ব্যবহার করে?
কারসিজেনিকেট

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

উত্তর:


10

এমোরিটাইজড কনস্ট্যান্ট টাইম প্রায় সর্বদা কনস্ট্যান্ট টাইমের সমতুল্য হিসাবে বিবেচিত হতে পারে এবং আপনার অ্যাপ্লিকেশনটির সুনির্দিষ্ট বিবরণ এবং আপনি এই সারিটিতে কী কী ব্যবহারের পরিকল্পনা করছেন তা না জেনে বেশিরভাগ সম্ভাবনা হ'ল আপনি coveredাকা পড়ে যাবেন।

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

তবে, মনে রাখবেন যে ডিফল্টরূপে, অ্যারে তালিকা থেকে এলোমেলো অপসারণ ও (1) নয়, এটি ও (এন), কারণ অ্যারে তালিকা সরানো আইটেমের পরে সমস্ত আইটেমকে সরানো স্থানে নিয়ে যায় আইটেম। ও (১) অর্জন করতে আপনাকে মুছে ফেলা আইটেমিকে অ্যারের তালিকার শেষ আইটেমের অনুলিপি সহ প্রতিস্থাপন করতে হবে এবং তারপরে শেষ আইটেমটি সরিয়ে ফেলতে হবে, যাতে কোনও আইটেম স্থানান্তরিত না হয়। তবে তারপরে, আপনি যদি এটি করেন তবে আপনার আর কোনও কাতার নেই।


1
অভিশাপ, অপসারণ ভাল পয়েন্ট; আমি এটা বিবেচনা করিনি। এবং যেহেতু আমরা এলোমেলোভাবে উপাদানগুলি সরিয়ে দিচ্ছি, এর অর্থ প্রযুক্তিগতভাবে বোঝা যাচ্ছে না যে এটি আর কোনও অর্থে কোনও সারি নয়?
কারসিজিনিট

হ্যাঁ, এর অর্থ এই যে আপনি সত্যই এটি একটি সারি হিসাবে আচরণ করছেন না। তবে আপনি কীভাবে আইটেমগুলি সরিয়ে ফেলার পরিকল্পনা করছেন তা আমি জানি না। যদি তাদের খুঁজে বের করার আপনার পদ্ধতিটি আশা করে যে সেগুলি ক্রমে যোগ করা হয়েছিল যাতে তারা কাতারে উপস্থিত থাকবে, তবে আপনি ভাগ্য থেকে দূরে রয়েছেন। আইটেমগুলির ক্রম গার্ফ হয়ে যায় যদি আপনি যত্ন না করেন তবে আপনি ভাল আছেন।
মাইক নাকিস

2
প্রত্যাশাটি আমার ইন্টারফেসটি RandomQueueবাস্তবায়িত করার Queueজন্য এবং সরবরাহিত removeপদ্ধতির জন্য মাথাটি পপ করার পরিবর্তে এলোমেলোভাবে মুছে ফেলার জন্য, যাতে নির্দিষ্ট ক্রমের উপর নির্ভর করার কোনও উপায় হওয়া উচিত নয়। আমি মনে করি তখন এর এলোমেলো প্রকৃতি দেওয়া হয়েছে, ব্যবহারকারী এটির কোনও নির্দিষ্ট অর্ডার রাখবেন বলে আশা করা উচিত নয়। আমি আমার প্রশ্নের স্পষ্টতার জন্য অ্যাসাইনমেন্টটি উদ্ধৃত করেছি। ধন্যবাদ.
কারসিজিনিট

2
হ্যাঁ, তবে মনে হচ্ছে আপনি ঠিকঠাক হয়ে যাবেন যদি আপনি কেবলমাত্র পরামর্শ দিয়েছিলেন যে আইটেমটি অপসারণ করা হয়েছে suggested
মাইক নাকিস

আপনি যদি কিছু মনে না করেন তবে একটি শেষ জিনিস। আমি এটিকে আরও বেশি ভেবে দেখেছি এবং মনে হয় না "সত্য" ও (1) সংযোজন এবং "সত্য" ও (1) এলোমেলো অপসারণ উভয়ই সম্ভব; এটি ২ এর মধ্যে একটি বাণিজ্য হবে You এটা কি সত্য? আবারো তোমাকে ধন্যবাদ.
কারসিজিনিট

14

প্রশ্নটি বিশেষত ধ্রুবক সময়ের জন্য জিজ্ঞাসা করে, এবং একটি নিয়মিত ধ্রুবক সময় নয় বলে মনে হয় । সুতরাং উদ্ধৃত প্রশ্নের সম্মানের সাথে, না, তারা কার্যকরভাবে একই নয় *। তারা কি বাস্তব বিশ্বের অ্যাপ্লিকেশনগুলিতে রয়েছে?

নিয়মিত ধ্রুবক সহ সাধারণ সমস্যাটি হ'ল মাঝেমধ্যে আপনাকে জমা theণ পরিশোধ করতে হয়। সুতরাং সন্নিবেশগুলি সাধারণত ধ্রুবক থাকে, কখনও কখনও নতুন ব্লক বরাদ্দ করা হলে আপনাকে পুনরায় সবকিছু পুনরায় প্রবেশের ওভারহেড ভোগ করতে হয়।

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

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

এটি নির্ভর করে যে এই ব্যয়টি আসলে কত বেশি on ভেক্টররা তাদের পুনর্নির্মাণ ব্যয় তুলনামূলকভাবে কম হওয়ায় ভাল পারফর্ম করার ঝোঁক। আপনি যদি হ্যাশ ম্যাপে যান তবে পুনঃব্যবস্থাপনা অনেক বেশি হতে পারে। যদিও আবার, বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য সম্ভবত ভাল, বিশেষত দীর্ঘস্থায়ী সার্ভারগুলি পাত্রে থাকা আইটেমগুলির উপরের আবদ্ধ থাকে।

* যদিও এখানে একটি সমস্যা আছে। যে কোনও সাধারণ উদ্দেশ্যে ধারক সন্নিবেশের জন্য স্থির সময় হতে দুটি জিনিসের একটি অবশ্যই ধরে রাখতে হবে:

  • ধারকটির একটি নির্দিষ্ট সর্বোচ্চ আকার থাকতে হবে; অথবা
  • আপনি ধরে নিতে পারেন পৃথক উপাদানগুলির মেমরি বরাদ্দ করা ধ্রুবক সময়।

"লিভার সার্ভার" এখানে ব্যবহার করার জন্য একটি অদ্ভুত ফ্রেসিং বলে মনে হচ্ছে। আপনি সম্ভবত "লাইভ সার্ভার" বলতে চান?
পিটার জেরকেনস

6

এটি নির্ভর করে - আপনি থ্রুপুট বা বিলম্বের জন্য অনুকূল করছেন কিনা তার উপর:

  • দেরি-সংবেদনশীল সিস্টেমগুলির সামঞ্জস্যপূর্ণ কর্মক্ষমতা প্রয়োজন। এ জাতীয় দৃশ্যের জন্য, আমাদের সিস্টেমের সবচেয়ে খারাপ আচরণের উপর জোর দিতে হবে। উদাহরণগুলি হ'ল নরম রিয়েল টাইম সিস্টেমগুলি যেমন গেমগুলি যা একটি ধারাবাহিক ফ্রেমরেট অর্জন করতে চায় বা ওয়েব সার্ভারগুলিকে নির্দিষ্ট সময়সীমার মধ্যে একটি প্রতিক্রিয়া পাঠাতে হয়: সিপিইউ চক্রগুলি নষ্ট হওয়ার চেয়ে ভাল।
  • যতক্ষণ না দীর্ঘমেয়াদে সর্বাধিক পরিমাণে ডেটা প্রক্রিয়া করা যায় ততক্ষণ মাধ্যমে থ্রুপুট-অনুকূলিত সিস্টেমগুলি মাঝেমধ্যে স্টলগুলির বিষয়ে চিন্তা করে না। এখানে, আমরা প্রাথমিকভাবে মোড়কিত পারফরম্যান্সে আগ্রহী। সংখ্যা ক্রাঞ্চিং বা অন্যান্য ব্যাচ-প্রসেসিং কাজের ক্ষেত্রে সাধারণত এটি হয়।

মনে রাখবেন যে একটি সিস্টেমে বিভিন্ন উপাদান থাকতে পারে যা অবশ্যই আলাদাভাবে শ্রেণিবদ্ধ করা উচিত। যেমন একটি আধুনিক পাঠ্য প্রসেসরের একটি বিলম্ব-সংবেদনশীল ইউআই থ্রেড থাকবে তবে বানান চেকিং বা পিডিএফ এক্সপোর্টের মতো অন্যান্য কাজের জন্য থ্রুপুট-অনুকূলিত থ্রেড।

এছাড়াও, অ্যালগরিদমিক জটিলতা প্রায়শই আমাদের ততটুকু বিবেচ্য হয় না যতটা আমরা ভাবতে পারি: যখন কোনও সমস্যা একটি নির্দিষ্ট সংখ্যায় আবদ্ধ থাকে, তখন প্রকৃত এবং পরিমাপ কর্মক্ষমতা বৈশিষ্ট্যগুলি "খুব বড় এন এর " জন্য আচরণের চেয়ে বেশি গুরুত্বপূর্ণ more


দুর্ভাগ্যক্রমে, আমার ব্যাকগ্রাউন্ড খুব কম। প্রশ্নটি এখানে শেষ হয়: "একটি র‌্যান্ডমকিউতে অ্যাড (এক্স) এবং অপসারণ () অপারেশনগুলি প্রতি ক্রিয়াকলাপে ধ্রুব সময়ে চালানো উচিত"।
কারসিজিনিট

2
@ কারসিজেনিকেট আপনি যদি না জানেন যে সিস্টেমটি ল্যাটেন্সি-সংবেদনশীল, তথ্যের কাঠামো নির্বাচন করতে মোড়যুক্ত জটিলতা ব্যবহার করা একেবারে পর্যাপ্ত হতে হবে।
আমন

আমার ধারণা আছে এটি কোনও প্রোগ্রামিং অনুশীলন বা পরীক্ষা হতে পারে। এবং অবশ্যই একটি সহজ এক না। একেবারে সত্য যে এটি খুব কমই গুরুত্বপূর্ণ।
gnasher729

1

যদি আপনাকে একটি "এমরোটাইজড ধ্রুবক সময়" অ্যালগরিদম জিজ্ঞাসা করা হয় তবে আপনার অ্যালগরিদমটি মাঝে মাঝে দীর্ঘ সময় নিতে পারে । উদাহরণস্বরূপ, আপনি যদি সি ++ তে std :: ভেক্টর ব্যবহার করেন তবে এ জাতীয় ভেক্টর 10 টি অবজেক্টের জন্য স্থান বরাদ্দ করতে পারে এবং আপনি যখন 11 তম বস্তু বরাদ্দ করেন তখন 20 টি অবজেক্টের জন্য স্থান বরাদ্দ করা হয়, 10 টি বস্তু অনুলিপি করা হয় এবং 11 তম যোগ হয়, যা যথেষ্ট সময় লাগে। তবে আপনি যদি মিলিয়ন অবজেক্ট যোগ করেন তবে গড় সময় দ্রুত থাকতে আপনার 999,980 টি দ্রুত এবং 20 ধীর গতিতে কাজ করতে পারে।

যদি আপনাকে "ধ্রুবক সময়" অ্যালগরিদম জিজ্ঞাসা করা হয়, তবে প্রতিটি একক ক্রিয়াকলাপের জন্য আপনার অ্যালগরিদম সর্বদা দ্রুত হওয়া উচিত । এটি রিয়েল-টাইম সিস্টেমগুলির জন্য গুরুত্বপূর্ণ যেখানে আপনার একটি গ্যারান্টি দরকার হতে পারে যে প্রতিটি একক ক্রিয়াকলাপ সর্বদা দ্রুত। "ধ্রুব সময়" খুব প্রায়ই প্রয়োজন হয় না, কিন্তু এটা স্পষ্টভাবে হয় না একই হিসাবে "ধ্রুবক সময় amortized"।

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