কিভাবে একটি পাসে লিঙ্কযুক্ত তালিকার মাঝারি উপাদানটি খুঁজে পাবেন?


12

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


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

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

2
ঠিক আছে, প্রশ্নটি এখানে অনেক আলোচনার জন্ম দেয়। তার মানে এটি একটি সম্মানের ক্ষেত্রে একটি ভাল সাক্ষাত্কারের প্রশ্ন: এটি আপনাকে ভাবতে শুরু করে।
হেন্ডরিক জানুয়ারী

3
আমি তাই "উত্তর দিতে চাই সমস্ত উপাদানগুলিকে একটি ভেক্টরে পড়ুন, তারপরে উপাদান আকারের () / 2 এ অ্যাক্সেস করুন"
কর্ট

1
@ হেন্ডরিকজান আসলে, আমি মনে করি এটি একটি সম্পূর্ণ ভয়ঙ্কর সাক্ষাত্কারের প্রশ্ন। প্রথমত, উত্পাদনশীল আলোচনার পরিবর্তে "এক পাসে" অর্থ কী, তা নিয়ে তর্ক বাড়ে সম্ভবত। দ্বিতীয়ত, কোনও প্রার্থী "সঠিক" উত্তরটি খুঁজে বের করতে পারে এবং তারপরে এটিকে প্রত্যাখ্যান করতে পারে কারণ তারা ভেবেছিল যে এটি "একটি পাস" মাপদণ্ড লঙ্ঘন করেছে। তৃতীয়, কারণ এটি একটি সুপরিচিত প্রশ্ন, এটি "আপনি কি জনপ্রিয় সাক্ষাত্কারের প্রশ্নগুলি জানেন?" "আপনি কি এই কাজের জন্য উপযুক্ত?" এগুলির যে কোনও একটি এটিকে প্রশ্ন হিসাবে ডুবিয়ে ফেলার পক্ষে পর্যাপ্ত হওয়া উচিত; তিনটি একই সাথে একটি বিপর্যয়।
ডেভিড রিচার্বি

উত্তর:


24

প্রতারণা করে, এবং একই সাথে দুটি সমান্তরালে পাস করে। তবে নিয়োগকারীরা এটি পছন্দ করবেন কিনা তা আমি জানি না।

একটি সুন্দর কৌশল সহ একক সংযুক্ত তালিকায় করা যেতে পারে be দুটি পয়েন্টার তালিকার উপরে ভ্রমণ করে, একটি দ্বিগুণ গতির সাথে। দ্রুত যখন শেষটি পৌঁছে, অন্যটি অর্ধপথ হয়।


1
হ্যাঁ, এটি একক পাস কিনা তা স্পষ্ট নয়। প্রশ্নটি এই বিষয়ে অস্পষ্ট।
ডেভিড রিচারবি

2
যাইহোক, এটি ধাঁধার সাথে সম্পর্কিত যেখানে আপনার দুটি মোমবাতি রয়েছে, প্রতিটি এক ঘন্টা জ্বলছে এবং আপনাকে 45 মিনিট পরিমাপ করতে বলা হবে।
হেনড্রিক জানুয়ারী

2
তালিকার পুনরাবৃত্তি, উপাদান গণনা এবং তারপরে দ্বিতীয়বারের মতো আধবারের দিক থেকে পুনরুক্তি করা কি আসলেই এর চেয়ে আলাদা? যখন আপনি অতিরিক্ত অর্ধেক পুনরাবৃত্তি করেন তখন সমস্তই আলাদা। @ আরবেরি ইউং অন্যান্য অনুরূপ উত্তরে যেমন উল্লেখ করেছেন, এটি সত্যিই একটি পাস নয়, এটি একটি পাস এবং অর্ধেক।

2
যদি তালিকাটি দীর্ঘ হয় তবে উভয় পয়েন্টারকে "সমান্তরালভাবে" সরিয়ে নেওয়া শুরু থেকে দ্বিতীয়বারের চেয়ে পুনরুক্ত হওয়ার চেয়ে কম ক্যাশে মিস করবে।
zwol

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

7

যদি এটি দ্বিগুণ সংযুক্ত তালিকাগুলি না হয় তবে আপনি কেবল তালিকাটি গণনা করতে এবং ব্যবহার করতে পারেন তবে এটির জন্য সবচেয়ে খারাপ ক্ষেত্রে আপনার স্মৃতিশক্তি দ্বিগুণ করা দরকার এবং তালিকাটি মেমরির মধ্যে সঞ্চয় করতে খুব বেশি বড় হলে এটি কাজ করবে না।

একটি সহজ, প্রায় নিরীহ সমাধান, প্রতি দুটি নোডের মাঝারি নোডকে কেবল বাড়িয়ে তোলা

function middle(start) {
    var middle = start
    var nextnode = start
    var do_increment = false;
    while (nextnode.next != null) {
        if (do_increment) {
             middle = middle.next;
        }
        do_increment = !do_increment;
        nextnode = nextnode.next;
    }
    return middle;
}

আপনার দ্বিতীয় বিকল্পটি সঠিক উত্তর (অবশ্যই IMHO) O
ম্যাথু ক্রামলে

1
এটি আসলে লিঙ্কযুক্ত তালিকার উপরে 1 1/2 পাস করছে।
আরবেরি ইয়ং

6

উপর elaborating হেনড্রিক এর উত্তর

যদি এটি দ্বিগুণ লিঙ্কযুক্ত তালিকাগুলি হয় তবে উভয় প্রান্ত থেকে পুনরাবৃত্তি করুন

function middle(start, end) {
  do_advance_start = false;
  while(start !== end && start && end) {
     if (do_advance_start) {
        start = start.next
     }
     else {
        end = end.prev
     }
     do_advance_start = !do_advance_start
  }
  return (start === end) ? start : null;
}

প্রদত্ত [1, 2, 3] => 2

1, 3
1, 2
2, 2

প্রদত্ত [1, 2] => 1

1, 2
1, 1

প্রদত্ত [1] => 1

প্রদত্ত [] => null


এই দক্ষ কিভাবে? আপনি n বারও পুনরাবৃত্তি করছেন এবং n / 2 নয়।
করণ খান্না

3

সংযুক্ত তালিকার নোডগুলিতে ইঙ্গিত করতে সক্ষম পয়েন্টার সহ একটি কাঠামো তৈরি করুন এবং একটি পূর্ণসংখ্য ভেরিয়েবল যা তালিকার নোডের সংখ্যা গণনা করে।

struct LL{
    struct node *ptr;
    int         count;
}start;

start.ptrstart.count=1
start.count

start.count


-2

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

এখানে কিছু জাভা কোড রয়েছে যা পয়েন্টটি পারাপার করবে (যদিও ডায়নামিক অ্যারের ধারণাটি কিছুটা দুর্বল হবে)। আমি সি / সি ++ সরবরাহ করব তবে আমি সেই অঞ্চলে খুব মরিচা।

public Node getMiddleNode(List<Node> nodes){

    int size = 1;
    //add code to dynamically increase size if at capacity after adding
    Node[] pointers = new Node[10];

    for (int i = 0; i < nodes.size(); i++){
        //remember to dynamically allocate more space if needed
        pointers[i] = nodes.get(i);
        size++;
    }

    return pointers[(size - 1)/2];

}

-3

পুনরাবৃত্তি একাধিক পাস হিসাবে বিবেচনা করা হয়?

রেফারেন্স দ্বারা একটি পূর্ণসংখ্যা গণনা পাস করে তালিকাটি শেষ দিকে ট্র্যাভার করুন। পরবর্তী রেফারেন্সের জন্য প্রতিটি স্তরে সেই মানের একটি স্থানীয় কপি তৈরি করুন, এবং পরবর্তী কলটিতে যাওয়া রেফ গণনা বৃদ্ধি করুন।

শেষ নোডে, গণনাটিকে দুটি দ্বারা বিভক্ত করুন এবং কাটা / মেঝে () কেটে ফেলুন (ফলাফলটি যদি আপনি চান তবে প্রথম নোডটি "মাঝারি" হয়ে উঠবে যখন কেবল দুটি উপাদান থাকবে) বা বৃত্তাকার (আপনি যদি দ্বিতীয় নোডটি চান মধ্যে"). একটি শূন্য- বা এক-ভিত্তিক সূচক যথাযথভাবে ব্যবহার করুন।

আনওয়াইন্ডিং, স্থানীয় অনুলিপি (যা নোডের সংখ্যা) এর সাথে রেফ গণনাটি মেলে। সমান হলে, সেই নোডটি ফিরিয়ে দিন; অন্যথায় পুনরাবৃত্তির কল থেকে ফিরে আসা নোডটি ফিরিয়ে দিন।

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

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


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

এটি একটি অনুমান হতে পারে তবে আমি যখন এক মুহূর্ত এবং 30 সেকেন্ডেরও কম পরে দেখি তবে প্রতিটি পোস্টের ঠিক -1 থাকে, এটি অযৌক্তিক নয়। যদিও এটি 5 বা 6 জন ভিন্ন লোক ছিল, তাদের মধ্যে একটিও কেন এই মন্তব্যটি ছাড়েনি। তবে অন্তত একটি কারণ বলার জন্য আপনাকে ধন্যবাদ। কোডের থেকে কেন একটি শব্দযুক্ত ব্যাখ্যা ভাল - আমি তা পাই না - হ্যাঁ, এটি একটি টেলিফোনিক সাক্ষাত্কারের জন্য, তবে আমি ওপিকে পুনঃব্যবহারের জন্য একটি ক্যানড উত্তর দিচ্ছি না, আমি তাকে এটি করার উপায় দেখিয়ে দিচ্ছি। IE আমি মনে করি কোনও পোস্টকে নিম্নমানের কারণ এটির কোডটি বাতিল করা হয়েছে, তবে কমপক্ষে আপনি কেন এটি করেছিলেন তা বলে আপনাকে ধন্যবাদ।
জেমস কে

সুস্পষ্ট পয়েন্ট - এটি আমার কাছে ঘটেছিল না যে আপনি ভোটের সময় সম্পর্কে জানতে পারবেন (পৃষ্ঠাটি লোড হওয়া যখন তারা হয়েছিল তখনই আমি মনে করি, আমাদের মতো সাধারণ ব্যবহারকারীরা এটি খুঁজে বের করতে পারে)। আমরা এখানে আসল কোড এড়াতে কেন চেষ্টা করি সে সম্পর্কে আমাদের কয়েকটি দম্পতি পোস্ট করেছেন: (1) (2)
ডেভিড রিচারবি

মেটা লিঙ্কগুলির জন্য ধন্যবাদ। আমি প্রায়শই জিজ্ঞাসিত প্রশ্নগুলি পড়েছিলাম, তবে আমি সেখানে কিছুই দেখতে পাইনি - এমন নয় যে আমি এমন কিছু লক্ষ্য করতাম, সম্ভবত, এমন কিছু নয় যা আমি প্রত্যাশা করতাম। ডাইনিং করার পরে আমি যখন যাচাই করেছিলাম তখন কিছুই খুঁজে পেলাম না। আমি এখনও এটি উপেক্ষা করা হতে পারে, কিন্তু আমি চেহারা ছিল। মেটা পোস্টগুলিতে যুক্তিটি বোঝায়; উত্তরের জন্য ধন্যবাদ.
জেমস কে

-5

2 পয়েন্টার ব্যবহার করে। প্রতিটি পুনরাবৃত্তিতে এক এবং অন্য দ্বিতীয় বারবারে বৃদ্ধি। যখন 1 ম পয়েন্টার লিঙ্কযুক্ত তালিকার শেষের দিকে নির্দেশ করে, তখন 2 য় পয়েন্টার লিঙ্কযুক্ত তালিকার মধ্য মোডে নির্দেশ করবে।


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