স্কালায় একটি তালিকায় যুক্ত করার ক্ষেত্রে ও (এন) সময়ের জটিলতা রয়েছে কেন?


13

আমি কেবল পড়েছি যে একটি List(: +) এর জন্য অ্যাপেন্ড অপারেশনের সম্পাদনের সময়টি আকারের সাথে লম্বাভাবে বৃদ্ধি পায় List

এটিকে যুক্ত করা Listখুব সাধারণ অপারেশনের মতো মনে হয়। এটি করার মতো অহঙ্কারী পদ্ধতিটি কেন উপাদানগুলির পূর্বনির্ধারণ এবং তারপরে তালিকাটি বিপরীত করা উচিত? এটি কোনও ডিজাইনের ব্যর্থতাও হতে পারে না কারণ বাস্তবায়ন যে কোনও সময়ে পরিবর্তন করা যেতে পারে।

আমার দৃষ্টিকোণ থেকে, প্রিপেন্ডিং এবং সংযোজন উভয়ই ও (1) হওয়া উচিত।

এর কোন বৈধ কারণ আছে কি?


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

1
ক্রস সাইট সম্পর্কিত - স্কালার তালিকার শেষে একটি উপাদান যুক্ত করা - এর প্রকৃতি সম্পর্কে কিছুটা আছে। এটা তোলে প্রদর্শিত যে Scala একটি তালিকা অপরিবর্তনীয় হয়, এইভাবে আপনি এটা কপি করতে হবে, যা হে (ঢ) হয়।

আপনি স্কেল সরবরাহ করে এমন অনেকগুলি উপলভ্য ডেটা স্ট্রাকচার, বা হে (1) অ্যাপেন্ড সময় (ভেক্টর) এর সাথে অপরিবর্তনীয় ডেটা স্ট্রাকচার ব্যবহার করতে পারেন। List[T]ধরে নেওয়া যায় আপনি খাঁটি কার্যকরী ভাষায় আপনি যেভাবে ব্যবহার করছেন - সাধারণভাবে ডিকনস্ট্রাকশন এবং প্রিপেন্ডস দিয়ে মাথা থেকে কাজ করছেন।
কেচালাক্স

3
প্রস্তুতি নতুন মাথার পরবর্তী নোড পয়েন্টারটিকে বিদ্যমান অপরিবর্তনীয় তালিকায় রাখবে - যা পরিবর্তন করতে পারে না। থটস ও (1)।

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

উত্তর:


24

আমি আমার মন্তব্যটি কিছুটা প্রসারিত করব। List[T]ডাটা স্ট্রাকচার থেকে scala.collection.immutableআরো একটি বিশুদ্ধরূপে কার্মিক প্রোগ্রামিং ভাষা কাজে একটি অপরিবর্তনীয় তালিকা উপায় কাজ করতে অপ্টিমাইজ করা হয়। এটির খুব দ্রুত প্রিপেন্ড করার সময় রয়েছে এবং এটি ধরে নেওয়া হয় যে আপনি প্রায় সমস্ত অ্যাক্সেসের জন্য মাথায় কাজ করবেন।

অপরিবর্তনীয় তালিকার খুব দ্রুত প্রিপেনড সময় পাওয়া যায় কারণ তারা তাদের লিঙ্কযুক্ত তালিকাকে "কনস সেল" এর একটি সিরিজ হিসাবে মডেল করে। ঘরটি একটি একক মান এবং পরবর্তী কক্ষে একটি পয়েন্টার সংজ্ঞায়িত করে (ক্লাসিক একক-সংযুক্ত-তালিকার শৈলী):

Cell [Value| -> Nil]

আপনি যখন কোনও তালিকার কাছে অর্থ ছাড়েন, আপনি বিদ্যমান একটি তালিকা রেখে কেবলমাত্র একটি নতুন ঘর তৈরি করছেন:

Cell [NewValue| -> [Cell[Value| -> Nil]]

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

পুনরাবৃত্তভাবে তালিকাগুলিতে কাজ করতে এটি নিজেকে খুব ভাল ndsণ দেয়। ধরা যাক আপনি নিজের সংস্করণটিকে নিজেরাই সংজ্ঞায়িত করেছেন filter:

def deleteIf[T](list : List[T])(f : T => Boolean): List[T] = list match {
  case Nil => Nil
  case (x::xs) => f(x) match {
    case true => deleteIf(xs)(f)
    case false => x :: deleteIf(xs)(f)
  }
}

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

আপনি যদি সত্যিই দ্রুত সংযোজন চান, স্কালা চয়ন করার জন্য প্রচুর পরিবর্তনীয় এবং অপরিবর্তনীয় ডেটা স্ট্রাকচার সরবরাহ করে। পরিবর্তনীয় দিকের দিকে, আপনি সন্ধান করতে পারেন ListBuffer। বিকল্পভাবে, Vectorথেকে scala.collection.immutableএকটি দ্রুত সংযোজন সময় আছে।


এখন বুঝলাম! এটি সম্পূর্ণ জ্ঞান করে তোলে।
ডিপিএম

আমি কোনও স্কালাকে চিনি না, তবে এটি কি elseঅসীম লুপ নয়? আমি মনে করি এটির মতো কিছু হওয়া উচিত x::deleteIf(xs)(f)
সোভিক

@ এসভিক আহ ... হ্যাঁ হ্যাঁ তাই হয়। আমি এটি দ্রুত লিখেছিলাম এবং আমার কোড যাচাই করিনি, কারণ এখানে যাওয়ার জন্য আমার একটি সভা হয়েছিল: পি (এখনই ঠিক করা উচিত!)
কেচালাক্স

@ জুব্বত কারণ headএবং tailএই জাতীয় তালিকার সাথে অ্যাক্সেস খুব দ্রুত - কোনও হ্যাশ-ভিত্তিক মানচিত্র বা অ্যারে ব্যবহারের চেয়ে দ্রুত - এটি পুনরাবৃত্ত ফাংশনগুলির জন্য একটি দুর্দান্ত প্রকার। তালিকাগুলি বেশিরভাগ কার্যকরী ভাষায় (যেমন হাস্কেল বা স্কিম) মূল ধরণের হ'ল এটির একটি কারণ
ব্রুস

দুর্দান্ত উত্তর। আমি সম্ভবত একটি টিএল যুক্ত করব; ডিআর যা কেবলমাত্র বলে যে "আপনার প্রিপেন্ডিং করা উচিত, সংযোজন করা উচিত নয়" (বেশিরভাগ বিকাশকারীদের Listএস এবং অ্যাডেন্ডিং / প্রিপেন্ডিং সম্পর্কে বেস অনুমানগুলি পরিষ্কার করতে সহায়তা করতে পারে )।
ড্যানিয়েল বি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.