অ্যারেডিক কেন লিঙ্কডলিস্টের চেয়ে ভাল


160

আমি উভয়ই ডেক ইন্টারফেস বাস্তবায়ন করায় জাভা এর অ্যারেডিক কেন জাভার লিংকডলিস্টের চেয়ে আরও ভাল তা বোঝার চেষ্টা করছি ।

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

যদি আমি এটি বুঝতে পারি তবে আমি এটি ব্যবহার করে আরও আত্মবিশ্বাসী হব। এটি মাথা ও লেজের রেফারেন্সগুলি কীভাবে পরিচালনা করে তা আমি জেডিকে বাস্তবায়ন পরিষ্কারভাবে বুঝতে পারি না।


5
এই প্রশ্নের আমি উত্তর এ কাজ দিন আগে দেখুন: stackoverflow.com/questions/6129805/...
সরাসরি Dinhani

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

উত্তর:


155

সংযুক্ত স্ট্রাকচারগুলি সম্ভবত প্রতিটি উপাদানকে ক্যাশে মিস দিয়ে পুনরাবৃত্তি করার জন্য সবচেয়ে খারাপ কাঠামো। এর উপরে তারা আরও বেশি স্মৃতি ব্যবহার করে।

আপনার যদি উভয় প্রান্তটি যুক্ত / সরানোর প্রয়োজন হয় তবে অ্যারেডেক লিঙ্কযুক্ত তালিকার চেয়ে উল্লেখযোগ্যভাবে ভাল। চক্রীয় সারির জন্য প্রতিটি উপাদান এলোমেলোভাবে অ্যাক্সেসও ও (1) is

কোনও লিঙ্কযুক্ত তালিকার একমাত্র আরও ভাল ক্রিয়াকলাপ পুনরাবৃত্তির সময় বর্তমান উপাদানটিকে সরিয়ে দিচ্ছে।


57
আরেকটি পার্থক্য মনে রাখবেন: লিঙ্কডলিস্ট নাল উপাদানগুলিকে সমর্থন করে, যেখানে অ্যারেডেক না।
লুক উশরউড

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

4
@ আন্ড্রেইআই, এটি গল্পের একমাত্র দিক। এমনকি যদি আপনি রিয়েল টাইম অ্যাপ্লিকেশনটির জন্য পুনরাবৃত্তির ব্যয়গুলি এবং প্রয়োজনীয় ক্ষমতাটি প্রাকপলক করার ক্ষমতা বাদ দেন, জিসিকে সম্পূর্ণ লিঙ্কডলিস্টে পুনরাবৃত্তি করতে হবে need মূলত আপনি ব্যয়গুলি (যা বুটের চেয়ে বেশি) সিসিতে স্থানান্তরিত করছেন।
বেটসেস

3
@DavidT। খ / সি এটি মুক্ত নোডের জিসি ব্যয় জড়িত, মাথা নির্ধারণের জন্য কার্ড চিহ্নিতকরণের প্রয়োজনও হতে পারে (আবার জিসির জন্য, যদি লিঙ্কডলিস্ট ইতিমধ্যে টেনারড জিনে থাকে) ... এবং এটি অতিরিক্ত দিকনির্দেশের শীর্ষে রয়েছে (ক্যাশে- মিস করুন) উপাদানটি ফিরে আসুন এবং রিলিং করুন।
বেসসেসস

1
এছাড়াও, LinkedListপ্রয়োগ না করার Listসময় ArrayDeque। এর অর্থ হল এর LinkedListমতো পদ্ধতি রয়েছে indexOfবা remove(int)যখন ArrayDequeনেই। এটি কখনও কখনও গুরুত্বপূর্ণ হতে পারে।
heেকা কোজলভ

60

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

এটা সুদ হতে পারে তবে আমি একটি প্রমাণ যে যোগ (সংযোজন) এর একটি উপাদান আছে ArrayListবা ArrayDequeamortized ধ্রুব সময় রান; পড়ুন এই


26

ArrayDeque জাভা 6 এর সাথে নতুন, তাই প্রচুর কোড (বিশেষত প্রকল্পগুলি যা পূর্ববর্তী জাভা সংস্করণের সাথে সামঞ্জস্য করার চেষ্টা করে) এটি ব্যবহার করে না।

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


17

যে সমস্ত লোক সমালোচনা করে LinkedList, সমস্ত Listজাভা যে জাভাতে ব্যবহার করা হয়েছে তা সম্ভবত ব্যবহার করে ArrayListএবং LinkedListবেশিরভাগ সময় জাভা before এর আগে হয়েছে এবং বেশিরভাগ বইয়ের শুরু হিসাবে শেখানো হচ্ছে বলেই মনে করে।

কিন্তু তার মানে এই নয়, আমি অন্ধ গ্রহণ করা হবে LinkedList'র বা ArrayDequeএর দিকে। আপনি যদি জানতে চান, ব্রায়ান দ্বারা করা নীচের বেনমার্কটি একবার দেখুন ।

পরীক্ষার সেটআপ বিবেচনা করে:

  • প্রতিটি পরীক্ষার অবজেক্ট একটি 500 টি অক্ষরের স্ট্রিং। প্রতিটি স্ট্রিং মেমরির একটি পৃথক বস্তু।
  • পরীক্ষার সময় পরীক্ষার অ্যারের আকার বিভিন্ন হবে ied
  • প্রতিটি অ্যারের আকার / সারি-বাস্তবায়ন সংমিশ্রণের জন্য, 100 টি পরীক্ষা চালানো হয় এবং প্রতি-পরীক্ষার গড় সময় গণনা করা হয়।
  • প্রতিটি পরীক্ষার মধ্যে প্রতিটি বস্তু দিয়ে প্রতিটি সারি পূরণ করা থাকে, তারপরে সেগুলি সমস্ত অপসারণ করা হয়।
  • মিলিসেকেন্ডের ক্ষেত্রে সময় পরিমাপ করুন।

পরীক্ষার ফলাফল:

  • 10,000 টি উপাদানের নীচে, লিঙ্কডলিস্ট এবং অ্যারেডেক উভয় পরীক্ষারই উপ 1 এমএস স্তরে গড়ে গড়েছে।
  • ডেটার সেটগুলি আরও বড় হওয়ার সাথে সাথে অ্যারেডেক এবং লিংকডলিস্ট গড় পরীক্ষার সময়ের মধ্যে পার্থক্য আরও বড় হয়।
  • 9,900,000 উপাদানগুলির পরীক্ষার আকারে, লিঙ্কলিস্ট পদ্ধতির অ্যারেডেক পদ্ধতির চেয়ে 165% বেশি সময় নিয়েছে।

চিত্রলেখ:

এখানে চিত্র বর্ণনা লিখুন

ছাড়াইয়া লত্তয়া:

  • যদি আপনার প্রয়োজনীয়তা 100 বা 200 টি উপাদান সংরক্ষণ করে থাকে তবে এটি কোনও ক্যু ব্যবহার করে খুব বেশি পার্থক্য করবে না।
  • তবে, আপনি যদি মোবাইলে বিকাশ করছেন, আপনি সর্বাধিক ক্ষমতার একটি ArrayListবা ArrayDequeএকটি ভাল অনুমান সহ ব্যবহার করতে চাইতে পারেন যা কঠোর মেমরির সীমাবদ্ধতার কারণে তালিকার প্রয়োজন হতে পারে।
  • প্রচুর কোড বিদ্যমান রয়েছে, বিশেষভাবে LinkedListব্যবহার করার সিদ্ধান্ত নেওয়ার সময় খুব বেশি সাবধানতার সাথে ব্যবহার ArrayDequeকরে রচনা করা হয়েছে কারণ এটি ইন্টারফেসটি বাস্তবায়িত করে নাList (আমি মনে করি এটি যথেষ্ট বড় কারণ)। এটি হতে পারে যে আপনার কোডবেসটি তালিকা ইন্টারফেসের সাথে ব্যাপকভাবে কথা বলেছেন, সম্ভবত আপনি এবং এটির সাথে ঝাঁপ দেওয়ার সিদ্ধান্ত নিয়েছেন ArrayDeque। অভ্যন্তরীণ বাস্তবায়নের জন্য এটি ব্যবহার করা ভাল ধারণা হতে পারে ...

লিঙ্কযুক্ত তালিকার আবর্জনার কারণে এই বেঞ্চমার্কটি জিসি সময়টি কীভাবে গ্রহণ করবে?
0xbe5077

3

ArrayDeque এবং LinkedList বাস্তবায়ন করছি Deque ইন্টারফেস কিন্তু বাস্তবায়ন ভিন্ন।

মূল পার্থক্য:

  1. ArrayDeque ক্লাসের রিসাইজেবল অ্যারের বাস্তবায়ন Deque ইন্টারফেস এবং LinkedList বর্গ তালিকা বাস্তবায়ন

  2. শূন্য উপাদান যোগ করা যেতে পারে LinkedList কিন্তু না ArrayDeque

  3. উভয় প্রান্তে সংযোজন এবং অপসারণের জন্য লিংকডলিস্টের চেয়ে অ্যারেডেক আরও দক্ষ এবং লিঙ্কডলিস্ট বাস্তবায়ন পুনরাবৃত্তির সময়কার বর্তমান উপাদানটি সরিয়ে ফেলতে দক্ষ

  4. LinkedList বাস্তবায়ন চেয়ে আরো মেমরি হ্রাস ArrayDeque

সুতরাং আপনার যদি উভয় প্রান্তে নল উপাদানগুলি & কম মেমরি এবং& উপাদানগুলি যুক্ত / সরানোর দক্ষতা সন্ধান করতে না চান তবে অ্যারেডেক সেরা

পড়ুন ডকুমেন্টেশন আরো বিস্তারিত জানার জন্য।


13
"লিঙ্কযুক্ত তালিকায় শেষ উপাদানটি পেতে ও (এন) লাগবে।" ঠিক সত্য নয়। লিংকডলিস্টটি দ্বিগুণ লিঙ্কযুক্ত তালিকা হিসাবে কার্যকর করা হয়েছে যাতে আপনাকে শেষ উপাদানটি ( header.previous.element) পেতে তালিকাটি অতিক্রম করতে হবে না । "মেমরি দক্ষতা" দাবীটিকেও চ্যালেঞ্জ করা যেতে পারে যেহেতু ব্যাকিং অ্যারেটি সর্বদা ২ এর পরবর্তী শক্তিতে পুনরায় আকার দেওয়া হয়
ক্লাইমেন্ট ম্যাথিউইউ

5
"শেষ উপাদানটি পেতে ও (এন) লাগবে" ভ্রং। লিঙ্কযুক্ত তালিকাটি সর্বশেষ নোডের একটি রেফারেন্স রাখে এবং লিংকডলিস্ট.ডেসেন্ডিংআইট্রেটর () এর সেই নোডটি পান। সুতরাং আমরা ও (1) পারফরম্যান্স পাই। দেখুন: কফিরিয়েন্টেডপ্রগ্রামিং.ওয়ার্ডপ্রেস.কম / ২০১৮ / 04 / 23/… (এভাবে ডাউনভোটিং)।
লিও উফিমটসেভ

1
আপনি যখন Iteratorসর্বশেষ উপাদানটি অ্যাক্সেস করতে একটি ব্যবহার করেন , অপারেশনটি উভয় শ্রেণীর জন্য O (N) হয় is আপনি যখন সাধারণ Dequeইন্টারফেস ব্যবহার করেন , উভয় শ্রেণীর জন্য শেষ উপাদানটি অ (অ) অ্যাক্সেস করা হয়। আপনি কোন দৃষ্টিতেই বিবেচনা করুন না কেন, একই সাথে ArrayDequeও (1) এবং ও (এন) কে দায়ী LinkedListকরা ভুল, is
হলগার

আপনার সমস্ত পরামর্শ নেওয়া হয়েছে এবং সামগ্রীটি সংশোধন করা হয়েছে
রবীন্দ্র বাবু

1

যদিও ArrayDeque<E>এবং LinkedList<E>উভয়ই Deque<E>ইন্টারফেস প্রয়োগ করেছে , তবে অ্যারেডেক মূলত অবজেক্ট অ্যারেটিকে E[]তার অবজেক্টের ভিতরে রাখার জন্য ব্যবহার করে, তাই এটি সাধারণত মাথা এবং লেজের উপাদানগুলির সন্ধানের জন্য সূচক ব্যবহার করে।

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


-1

এটা সবসময় হয় না।

উদাহরণস্বরূপ, নীচের ক্ষেত্রে লেটকোড 103 অনুসারে linkedlistভাল পারফরম্যান্স রয়েছে ArrayDeque

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> rs=new ArrayList<>();
        if(root==null)
            return rs;
        // 👇 here ,linkedlist works better
        Queue<TreeNode> queue=new LinkedList<>();
        queue.add(root);
        boolean left2right=true;
        while(!queue.isEmpty())
        {
            int size=queue.size();
            LinkedList<Integer> t=new LinkedList<>();
            while(size-->0)
            {
                TreeNode tree=queue.remove();
                if(left2right)  
                    t.add(tree.val);
                else
                    t.addFirst(tree.val);
                if(tree.left!=null)
                {
                    queue.add(tree.left);
                }
                if(tree.right!=null)
                {
                    queue.add(tree.right);
                }
            }
            rs.add(t);
            left2right=!left2right;
        }
        return rs;
    }
}

-5

কোনও উপাদান অ্যাক্সেস করার জন্য অ্যারেডিকের সময়ের জটিলতা হ'ল (1) এবং লিংকলিস্টের জন্য সর্বশেষ উপাদানটি অ্যাক্সেস করার জন্য ও (এন)। অ্যারেডেক থ্রেড নিরাপদ নয় তাই ম্যানুয়ালি সিঙ্ক্রোনাইজেশন প্রয়োজনীয় যাতে আপনি এটি একাধিক থ্রেডের মাধ্যমে অ্যাক্সেস করতে পারেন এবং সেগুলি দ্রুত হয়।


3
আপনি যদি LinkedListজাভাতে উল্লেখ করছেন Collection, এটি দ্বিগুণভাবে সংযুক্ত এবং এটি মাথা এবং লেজের দ্রুত অ্যাক্সেস পেয়েছে, সুতরাং শেষ উপাদানটিতে অ্যাক্সেস ও (1) লাগে takes
মরিস

লিঙ্কডলিস্টে শেষ উপাদান অ্যাক্সেস করা ও (এন) নয়। যদি আপনি অ্যারেন্ডিংআইটার () ব্যবহার করেন তবে এটি ও (1) এ সঞ্চালিত হয়। দেখুন coffeeorientedprogramming.wordpress.com/2018/04/23/... (সুতরাং downvote)।
লিও উফিমটসেভ

1
উভয় শ্রেণি থ্রেড-নিরাপদ নয়। এবং "ম্যানুয়ালি সিঙ্ক্রোনাইজেশন করা জরুরি" এবং এর শেষটির সাথে "তারা আরও দ্রুত" এর মধ্যে কোনও সংযোগ নেই।
হলগার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.