নিখুঁত ক্রিয়ামূলক প্রোগ্রামিং ভাষাগুলি কীভাবে দ্রুত পরিবর্তনের ডেটা মোকাবেলা করে?


22

আপনি কোন ডেটা স্ট্রাকচার ব্যবহার করতে পারেন যাতে আপনি ও (1) অপসারণ এবং প্রতিস্থাপন পেতে পারেন? অথবা আপনার যখন কাঠামোগত স্ট্রাকচারের প্রয়োজন বললে আপনি কীভাবে পরিস্থিতি এড়াতে পারেন?


2
আমরা যারা খাঁটি কার্যকরী প্রোগ্রামিং ভাষার সাথে কম পরিচিত, তাদের জন্য আপনি কি আরও কিছুটা ব্যাকগ্রাউন্ড সরবরাহ করতে পারেন যাতে আমরা বুঝতে পারি যে আপনার সমস্যাটি কী?
হতাশ

4
@ ফ্রেস্ট্রেটড উইথফর্মস ডিজাইনার খাঁটি কার্যকরী প্রোগ্রামিং ভাষার প্রয়োজন যে সমস্ত পরিবর্তনশীল অপরিবর্তনীয়, যার পরিবর্তে ডেটা স্ট্রাকচারের প্রয়োজন হয় যা "সংশোধিত" হওয়ার সময় নিজের নতুন সংস্করণ তৈরি করে।
ডোভাল

5
আপনি কি ওকাসাকির কাজ সম্পর্কে সম্পূর্ণরূপে কার্যকরী ডেটা স্ট্রাকচার সম্পর্কে সচেতন?

2
একটি সম্ভাবনা হ'ল পরিবর্তনের উপাত্তের জন্য একটি মোনাডকে সংজ্ঞায়িত করা (উদাহরণস্বরূপ haskell.org/ghc/docs/4.08/set/sec-marray.html দেখুন )। এইভাবে, পরিবর্তনীয় ডেটা আইও-তে একইরকম আচরণ করা হয়।
জর্জিও

1
@ কোডস ইনচাউস: তবে, এই ধরনের অপরিবর্তনীয় কাঠামোর সাধারণত সরল অ্যারেগুলির তুলনায় অনেক বেশি ওভারহেড থাকে। ফলস্বরূপ, সেখানে হয় খুব বাস্তবসম্মত পার্থক্য। এই কারণেই যে কোনও নিখুঁত কার্যকরী ভাষা যা সাধারণ-উদ্দেশ্যমূলক প্রোগ্রামিংয়ে লক্ষ্য করে তার কিছুটা নিরাপদ উপায়ে খাঁটি শব্দার্থবিজ্ঞানের সাথে সামঞ্জস্যপূর্ণ পরিবর্তনযোগ্য কাঠামো ব্যবহার করার উপায় থাকতে হবে। STমধ্যে Haskell একসংখ্যা এই চমৎকারভাবে আছে।
শে

উত্তর:


32

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

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

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

কার্যকরভাবে পরিবর্তনীয় স্থিতিকে একটি কার্যকরী সেটিংয়ে প্রবর্তনের জন্য আরেকটি বিকল্প STহ্যাস্কেলের মোনাড। এটি রূপান্তর ছাড়াই এবং unsafe*ফাংশন ব্যতীত বাস্তবায়িত করা যায় , এটি এমন আচরণ করে যেন এটি স্থিরভাবে ডেটা স্ট্রাকচারকে স্পষ্টভাবে (সিএফ। State) পাস করার চারপাশে কেবল অভিনব র্যাপার । তবে এমন কিছু ধরণের সিস্টেমের কৌতুকের কারণে যা মূল্যায়নের আদেশ কার্যকর করে এবং পালাতে বাধা দেয়, পারফরম্যান্সের সমস্ত সুযোগ-সুবিধা সহ এটি নিরাপদে স্থানের পরিবর্তনের মাধ্যমে প্রয়োগ করা যেতে পারে।


জিপ্পারগুলি আপনাকে একটি তালিকা বা ট্রি
জে কেতে

1
@jk। আমি লিঙ্কযুক্ত তাত্ত্বিক কম্পিউটার বিজ্ঞান পোস্টে সেগুলি উল্লেখ করা হয়েছে । তদুপরি, তারা অনেকগুলি প্রাসঙ্গিক ডেটা স্ট্রাকচারের কেবলমাত্র একটি (ভাল, একটি শ্রেণি) এবং সেগুলি নিয়ে আলোচনা করার সুযোগটি অল্প ব্যবহারের বাইরে।

যথেষ্ট ন্যায্য, লিঙ্কগুলি অনুসরণ করেনি
জে কে।

9

একটি সস্তা মিটেবল স্ট্রাকচার হ'ল আর্গুমেন্ট স্ট্যাক।

টিপিক্যাল এসআইসিপি-স্টাইলের ফ্যাক্টরিয়াল গণনাটি একবার দেখুন:

(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 যে চপল অপরিবর্তনীয় ডাটা স্ট্রাকচার বাহিরে স্থানীয় সুযোগ লিক না 'ছায়া' হয়। ক্লিন অনুরূপ কিছু অর্জনের জন্য ইউনিক্স ব্যবহার করে (যদি আমি সঠিকভাবে মনে করি)। মরিচা স্থিরভাবে পরীক্ষা করা অনন্য পয়েন্টারগুলির সাথে অনুরূপ জিনিসগুলি করতে সহায়তা করে।


1
ক্লিনে অনন্য ধরণের উল্লেখ করার জন্যও +1।
জর্জিও

@ 9000 আমি মনে করি আমি শুনেছি হাস্কেলের ক্লোজারের ট্রান্সজেন্টগুলির সাথে কিছু মিল রয়েছে - কেউ ভুল হলে আমার সংশোধন করে।
পল

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

1
@ পল আমি এতটা নিশ্চিত নই তবে হাসেলের কাছে এমএল এর অনুরূপ কিছু তৈরি করার refএবং সেগুলিকে একটি নির্দিষ্ট ক্ষেত্রের মধ্যে আবদ্ধ করার পদ্ধতি রয়েছে । দেখুন IORefবা STRef। এবং তারপরে অবশ্যই রয়েছে TVarএস এবং MVarগুলি যা একই রকম তবে বুদ্ধিমান সমবর্তী শব্দার্থক (এসএমএসের জন্য স্টেম TVarএবং মাইটেক্স এর ভিত্তিতে MVar)
ড্যানিয়েল গ্রেটজার

2

আপনি যা জিজ্ঞাসা করছেন তা কিছুটা বিস্তৃত। ও (1) অপসারণ এবং প্রতিস্থাপন কোন অবস্থান থেকে? একটি অনুক্রমের মাথা? লেজ? একটি নির্বিচারে অবস্থান? ব্যবহারের জন্য ডেটা স্ট্রাকচার সেই বিশদগুলির উপর নির্ভর করে। এটি বলেছিল যে, 2-3 আঙুলের গাছগুলি দেখতে পাওয়া যায় এমন এক বহুমুখী ধ্রুবক ডেটা কাঠামোর মতো:

আমরা 2-3 আঙুল গাছ উপস্থাপিত ধ্রুবক ক্রমগুলির ক্রিয়াকলাপের প্রতিনিধিত্ব করি যা ধীরে ধীরে স্থির সময়টিতে অ্যাক্সেসকে সমর্থন করে এবং ছোট অংশের আকারে সময়যুক্ত লোগারিথমিকের সাথে সংক্ষেপণ এবং বিভক্ত হয়।

(...)

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

সাধারণত অবিচ্ছিন্ন ডাটা স্ট্রাকচারের লগারিদমিক কর্মক্ষমতা থাকে যখন স্বেচ্ছাসেবক অবস্থানগুলিকে পরিবর্তন করা হয়। এটি সমস্যা বা সমস্যা নাও হতে পারে, যেহেতু O (1) অ্যালগরিদমের ধ্রুবক বেশি হতে পারে এবং লোগারিদমিক ধীরগতি একটি ধীর সামগ্রিক অ্যালগোরিদমে "শোষিত" হতে পারে।

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

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