আপনি কোন ডেটা স্ট্রাকচার ব্যবহার করতে পারেন যাতে আপনি ও (1) অপসারণ এবং প্রতিস্থাপন পেতে পারেন? অথবা আপনার যখন কাঠামোগত স্ট্রাকচারের প্রয়োজন বললে আপনি কীভাবে পরিস্থিতি এড়াতে পারেন?
ST
মধ্যে Haskell একসংখ্যা এই চমৎকারভাবে আছে।
আপনি কোন ডেটা স্ট্রাকচার ব্যবহার করতে পারেন যাতে আপনি ও (1) অপসারণ এবং প্রতিস্থাপন পেতে পারেন? অথবা আপনার যখন কাঠামোগত স্ট্রাকচারের প্রয়োজন বললে আপনি কীভাবে পরিস্থিতি এড়াতে পারেন?
ST
মধ্যে Haskell একসংখ্যা এই চমৎকারভাবে আছে।
উত্তর:
অবিচ্ছিন্ন ধ্রুবক সময় বা এমনকি (কিছু সীমাবদ্ধ ক্ষেত্রে যেমন কাতারে ) বিভিন্ন ধরণের সমস্যার জন্য ধ্রুবক সময় আপডেট করার জন্য অলসতা এবং অন্যান্য কৌশলগুলি কাজে লাগানোর জন্য প্রচুর ডেটা স্ট্রাকচার রয়েছে । ক্রিস ওকাসাকির পিএইচডি থিসিস " পিউরিলি ফাংশনাল ডেটা স্ট্রাকচারস" এবং একই নামের বইটি একটি প্রধান উদাহরণ (সম্ভবত প্রথম বড় একটি), তবে ক্ষেত্রটি তখন থেকেই এগিয়েছে । এই ডেটা স্ট্রাকচারগুলি সাধারণত ইন্টারফেসে কেবল বিশুদ্ধভাবে কার্যকর হয় না, তবে খাঁটি হাস্কেল এবং অনুরূপ ভাষায়ও প্রয়োগ করা যেতে পারে এবং পুরোপুরি অবিচল থাকে।
এমনকি এই উন্নত সরঞ্জামগুলির কোনও ছাড়াই, সহজ ভারসাম্য বাইনারি অনুসন্ধান গাছগুলি লোগারিথমিক-সময় আপডেট দেয়, তাই পরিবর্তনীয় মেমরিটি সবচেয়ে খারাপভাবে লগারিদমিক ধীরগতির সাথে সিমুলেটেড করা যায়।
অন্যান্য বিকল্প রয়েছে, যা প্রতারণা হিসাবে বিবেচিত হতে পারে তবে বাস্তবায়ন প্রচেষ্টা এবং বাস্তব-বিশ্বের পারফরম্যান্সের ক্ষেত্রে এটি খুব কার্যকর। উদাহরণস্বরূপ, লিনিয়ার প্রকার বা স্বতন্ত্রতা প্রকারগুলি পূর্বের মানকে (যে রূপান্তরিত করা হবে মেমরিটি) ধরে রাখা থেকে প্রোগ্রামটিকে আটকে রেখে ধারণাগতভাবে বিশুদ্ধ ভাষার বাস্তবায়ন কৌশল হিসাবে স্থান পরিবর্তন করার অনুমতি দেয়। এটি ধ্রুবক ডেটা স্ট্রাকচারের চেয়ে কম সাধারণ: উদাহরণস্বরূপ, আপনি রাজ্যের পূর্ববর্তী সমস্ত সংস্করণ সংরক্ষণ করে সহজেই একটি পূর্বাবস্থায় লগ তৈরি করতে পারবেন না। এটি এখনও একটি শক্তিশালী হাতিয়ার, যদিও এএফআইকে এখনও প্রধান কার্যকরী ভাষাগুলিতে উপলভ্য নয়।
কার্যকরভাবে পরিবর্তনীয় স্থিতিকে একটি কার্যকরী সেটিংয়ে প্রবর্তনের জন্য আরেকটি বিকল্প ST
হ্যাস্কেলের মোনাড। এটি রূপান্তর ছাড়াই এবং unsafe*
ফাংশন ব্যতীত বাস্তবায়িত করা যায় , এটি এমন আচরণ করে যেন এটি স্থিরভাবে ডেটা স্ট্রাকচারকে স্পষ্টভাবে (সিএফ। State
) পাস করার চারপাশে কেবল অভিনব র্যাপার । তবে এমন কিছু ধরণের সিস্টেমের কৌতুকের কারণে যা মূল্যায়নের আদেশ কার্যকর করে এবং পালাতে বাধা দেয়, পারফরম্যান্সের সমস্ত সুযোগ-সুবিধা সহ এটি নিরাপদে স্থানের পরিবর্তনের মাধ্যমে প্রয়োগ করা যেতে পারে।
একটি সস্তা মিটেবল স্ট্রাকচার হ'ল আর্গুমেন্ট স্ট্যাক।
টিপিক্যাল এসআইসিপি-স্টাইলের ফ্যাক্টরিয়াল গণনাটি একবার দেখুন:
(defn fac (n accum)
(if (= n 1)
accum
(fac (- n 1) (* accum n)))
(defn factorial (n) (fac n 1))
আপনি দেখতে পাচ্ছেন, দ্বিতীয় আর্গুমেন্টটি fac
দ্রুত পরিবর্তনশীল পণ্যটি রাখতে একটি পরিবর্তনীয় সংগ্রহকারী হিসাবে ব্যবহৃত হয় n * (n-1) * (n-2) * ...
। কোনও পরিবর্তনীয় পরিবর্তনশীল দৃষ্টিতে দেখা যায় না, যদিও অজান্তেই সংযোজকটিকে অন্য কোনও থ্রেড থেকে পরিবর্তন করার কোনও উপায় নেই।
এটি অবশ্যই একটি সীমাবদ্ধ উদাহরণ।
আপনি হেড নোডের সস্তা প্রতিস্থাপনের সাথে অপরিবর্তনীয় লিঙ্ক তালিকা পেতে পারেন (এবং মাথা থেকে কোনও অংশ প্রসারিত করে এক্সটেনশন দ্বারা): আপনি কেবল পুরানো মাথা যেমন ঠিক পরবর্তী নোডে নতুন মাথা পয়েন্ট তৈরি করেন। এটি অনেকগুলি তালিকা-প্রক্রিয়াজাতকরণ অ্যালগরিদমগুলির সাথে ভালভাবে কাজ করে (কিছু fold
ভিত্তিযুক্ত)।
যেমন HAMT- এর উপর ভিত্তি করে মিশ্র অ্যারেগুলি থেকে আপনি বেশ ভাল পারফরম্যান্স পেতে পারেন । যৌক্তিকভাবে আপনি কিছু কী-মান জোড় (গুলি) পরিবর্তিত করে একটি নতুন সাহসী অ্যারে পান। বাস্তবায়ন পুরানো এবং সদ্য নির্মিত বস্তুর মধ্যে বেশিরভাগ সাধারণ ডেটা ভাগ করতে পারে। এটি যদিও ও (1) নয়; সাধারণত আপনি লগারিদমিক কিছু পান, কমপক্ষে সবচেয়ে খারাপ ক্ষেত্রে। অপরদিকে অপরিবর্তনীয় গাছগুলি সাধারণত পরিবর্তনীয় গাছের তুলনায় কোনও কার্যকারিতা জরিমানা ভোগ করে না। অবশ্যই এটির জন্য কিছুটা মেমরির ওভারহেড প্রয়োজন যা সাধারণত নিষিদ্ধ from
আরেকটি পদ্ধতির ধারণাটি ভিত্তিতে তৈরি করা হয় যে কোনও গাছ যদি কোনও বনের মধ্যে পড়ে এবং কেউ এটি শুনতে না পায় তবে এটি শব্দ উত্পাদন করার প্রয়োজন নেই। এটি হ'ল, যদি আপনি প্রমাণ করতে পারেন যে কিছুটা মিউটেটেড স্টেট কখনও কখনও কোনও স্থানীয় সুযোগ ছেড়ে যায় না, আপনি নিরাপদে নিরাপদে এর মধ্যে ডেটা পরিবর্তন করতে পারেন।
Clojure হয়েছে transients যে চপল অপরিবর্তনীয় ডাটা স্ট্রাকচার বাহিরে স্থানীয় সুযোগ লিক না 'ছায়া' হয়। ক্লিন অনুরূপ কিছু অর্জনের জন্য ইউনিক্স ব্যবহার করে (যদি আমি সঠিকভাবে মনে করি)। মরিচা স্থিরভাবে পরীক্ষা করা অনন্য পয়েন্টারগুলির সাথে অনুরূপ জিনিসগুলি করতে সহায়তা করে।
ref
এবং সেগুলিকে একটি নির্দিষ্ট ক্ষেত্রের মধ্যে আবদ্ধ করার পদ্ধতি রয়েছে । দেখুন IORef
বা STRef
। এবং তারপরে অবশ্যই রয়েছে TVar
এস এবং MVar
গুলি যা একই রকম তবে বুদ্ধিমান সমবর্তী শব্দার্থক (এসএমএসের জন্য স্টেম TVar
এবং মাইটেক্স এর ভিত্তিতে MVar
)
আপনি যা জিজ্ঞাসা করছেন তা কিছুটা বিস্তৃত। ও (1) অপসারণ এবং প্রতিস্থাপন কোন অবস্থান থেকে? একটি অনুক্রমের মাথা? লেজ? একটি নির্বিচারে অবস্থান? ব্যবহারের জন্য ডেটা স্ট্রাকচার সেই বিশদগুলির উপর নির্ভর করে। এটি বলেছিল যে, 2-3 আঙুলের গাছগুলি দেখতে পাওয়া যায় এমন এক বহুমুখী ধ্রুবক ডেটা কাঠামোর মতো:
আমরা 2-3 আঙুল গাছ উপস্থাপিত ধ্রুবক ক্রমগুলির ক্রিয়াকলাপের প্রতিনিধিত্ব করি যা ধীরে ধীরে স্থির সময়টিতে অ্যাক্সেসকে সমর্থন করে এবং ছোট অংশের আকারে সময়যুক্ত লোগারিথমিকের সাথে সংক্ষেপণ এবং বিভক্ত হয়।
(...)
তদ্ব্যতীত, একটি সাধারণ আকারে বিভক্ত অপারেশনকে সংজ্ঞায়িত করে আমরা একটি সাধারণ উদ্দেশ্যে ডেটা স্ট্রাকচার পাই যা ক্রম, অগ্রাধিকার সারি, অনুসন্ধান ট্রি, অগ্রাধিকার অনুসন্ধান সারি এবং আরও অনেক কিছু হিসাবে পরিবেশন করতে পারে।
সাধারণত অবিচ্ছিন্ন ডাটা স্ট্রাকচারের লগারিদমিক কর্মক্ষমতা থাকে যখন স্বেচ্ছাসেবক অবস্থানগুলিকে পরিবর্তন করা হয়। এটি সমস্যা বা সমস্যা নাও হতে পারে, যেহেতু O (1) অ্যালগরিদমের ধ্রুবক বেশি হতে পারে এবং লোগারিদমিক ধীরগতি একটি ধীর সামগ্রিক অ্যালগোরিদমে "শোষিত" হতে পারে।
আরও গুরুত্বপূর্ণ বিষয়, ধ্রুবক ডেটা স্ট্রাকচারগুলি আপনার প্রোগ্রাম সম্পর্কে যুক্তি আরও সহজ করে তোলে এবং এটি সর্বদা আপনার অপারেশনের ডিফল্ট মোড হওয়া উচিত। যখনই সম্ভব আপনার অবিরাম ডেটা স্ট্রাকচারের পক্ষে থাকা উচিত এবং আপনি যখন প্রোফাইল তৈরি করে স্থির করেন যে স্থির ডাটা স্ট্রাকচারটি একটি পারফরম্যান্স বাধা। অন্য যে কোনও কিছুই অকাল অপটিমাইজেশন।