দুটি বৃহত্তর সেটের মধ্যে কম্পিউটিং সেট পার্থক্য


14

আমার দুটি বড় সেট এবং । প্রতিটি সেটে প্রায় এক মিলিয়ন এন্ট্রি থাকে এবং প্রতিটি এন্ট্রি একটি ধনাত্মক পূর্ণসংখ্যা যা সর্বোচ্চ 10 ডিজিট দীর্ঘ হয়। AB

এবং গণনা করার জন্য সেরা অ্যালগরিদম কোনটি ? অন্য কথায়, আমি দক্ষতার এন্ট্রিগুলির তালিকা গনা করতে যে নেই এবং তদ্বিপরীত? এই অপারেশনগুলিকে দক্ষ করে তোলার জন্য এই দুটি সেট উপস্থাপনের জন্য সেরা ডেটা স্ট্রাকচার কী হবে?ABBAAB

আমি যে সর্বোত্তম পদ্ধতির সাথে আসতে পারি তা হ'ল এই দুটি সেটকে বাছাই করা তালিকা হিসাবে স্টোর করা, এবং প্রতিটি উপাদানকে প্রতিটি উপাদানগুলির সাথে , একটি লিনিয়ার ফ্যাশনে তুলনা করা । আমরা কি আরও ভাল করতে পারি?AB


আপনি যদি এটি আলাদাভাবে সঞ্চয় করতে ইচ্ছুক হন তবে আপনি আরও ভাল ফলাফল পেতে সক্ষম হতে পারেন।
রিয়েলজ স্লাও

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

1
@ ব্যবহারকারী917279 একটি বড় বিষয়: আপনি সাধারণত প্রিপ্রোসেসিং / নির্মাণ সময়, একে অপরের বিরুদ্ধে ক্যোয়ারির সময় এবং মেমরির ব্যবহার বাণিজ্য করতে পারেন। আপনি কি খুব কমই সম্পাদনা করেন, তবে অনেক জিজ্ঞাসা করেন? অন্যান্য উপায় বৃত্তাকার? স্মৃতি কি উদ্বেগজনক নয়? এই জাতীয় প্রশ্নের উত্তর ব্যবহারিক দৃষ্টিকোণ থেকে দেওয়া যেতে পারে এবং "ডান" "তাত্ত্বিক" নির্মাণের পছন্দকে অবহিত করতে পারে।
রাফেল

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

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

উত্তর:


9

আপনি যদি কোনও বিশেষ ডেটা-স্ট্রাকচারে সেটগুলি সঞ্চয় করতে ইচ্ছুক হন তবে আপনি সম্ভবত কিছু আকর্ষণীয় জটিলতা পেতে পারেন।

আসুন I=O(min(|A|,|B|,|AΔB|))

তারপর আপনি সেট অপারেশন করতে পারি না এবং একটি Δ বি , প্রত্যেক হে ( আমি লগ ইন করুন | একটি | + + | বি |AB,AB,একজনবিAΔBপ্রত্যাশিত সময়। অতএব মূলত, আপনি দুটি সেটের সর্বনিম্ন আকার বা দুটি মাত্রার প্রতিসাম্য পার্থক্যের আকার পাবেন, যেটি কম। এটি লিনিয়ারের চেয়ে ভাল, যদি প্রতিসাম্যগত পার্থক্য ছোট হয়; অর্থাত। যদি তাদের একটি বড় ছেদ থাকে। প্রকৃতপক্ষে, দুটি সেট-পার্থক্যমূলক ক্রিয়াকলাপগুলির জন্য, এটি ব্যবহারিকভাবে আউটপুট-সংবেদনশীল, যেহেতু তারা একসাথে প্রতিসৃত পার্থক্যের আকার তৈরি করে।O(Ilog|A|+|B|I)

দেখুন Confluently জেদি সেট এবং মানচিত্রের আরও তথ্যের জন্য Olle Liljenzin (2013) দ্বারা।


কাগজে ট্রাপগুলি অনুসন্ধানের গাছগুলি অর্ডার করা হয়। আমি এগুলিকে অ-সাজানো ডেটা-স্ট্রাকচার হিসাবে গণনা করব না।
স্মোসেন

@ সুমসেন যথেষ্ট সত্য, আমি এটি সম্পাদনা করেছি।
রিয়েলজ স্লাও

6

একটি লিনিয়ার স্ক্যান সেরা যা আমি জানি কীভাবে করতে হয়, যদি সেটগুলি সাজানো লিঙ্কযুক্ত তালিকাগুলি হিসাবে উপস্থাপন করা হয়। চলমান সময় হ'ল O(|A|+|B|)

নোট করুন যে আপনাকে প্রতিটি উপাদান বি এর প্রতিটি উপাদানের সাথে তুলনা করার দরকার নেই । যে একটি রানটাইম হতে হবে হে ( | একজন | × | বি | ) , যা অনেক খারাপ। পরিবর্তে, এই দুটি সেটগুলির প্রতিসাম্যগত পার্থক্য গণনা করার জন্য, আপনি উভয় সেটের সাধারণ মানের বাদ দেওয়া মানগুলিতে যথাযথভাবে সংশোধিত, মার্জোর্টে "মার্জ" অপারেশনের অনুরূপ একটি কৌশল ব্যবহার করতে পারেন।ABO(|A|×|B|)

আরও বিশদে, আপনি গণনা করার জন্য নীচের মতো একটি পুনরাবৃত্ত আলগোরিদিম তৈরি করতে পারেন , ধরে নিবেন যে A এবং B এর সাথে সংযুক্ত তালিকাগুলি অনুসারে তাদের মান অনুসারে সাজানো হয়েছে:ABAB

difference(A, B):
    if len(B)=0:
        return A # return the leftover list
    if len(A)=0:
        return B # return the leftover list
    if A[0] < B[0]:
        return [A[0]] + difference(A[1:], B)
    elsif A[0] = B[0]:
        return difference(A[1:], B[1:])  # omit the common element
    else:
        return [B[0]] + difference(A, B[1:])

আমি সিউডো-পাইথনে এটি উপস্থাপন করেছি। আপনি পাইথন পড়া না থাকে, তাহলে A[0]যুক্ত তালিকা প্রধান A, A[1:]তালিকার বাকি, এবং +তালিকার সংযুক্তকরণের প্রতিনিধিত্ব করে। দক্ষতার কারণে, আপনি যদি পাইথনে কাজ করছেন, আপনি সম্ভবত এটি উপরের মতো বাস্তবায়ন করতে চাইবেন না - উদাহরণস্বরূপ, অনেক অস্থায়ী তালিকা তৈরি করা এড়াতে জেনারেটর ব্যবহার করা ভাল be তবে আমি চেয়েছিলাম আপনাকে সম্ভাব্যতম সহজ আকারে ধারণাগুলি প্রদর্শন করুন। এই সিউডো-কোডের উদ্দেশ্যটি কেবল অ্যালগরিদমকে চিত্রিত করা, কোনও কংক্রিট বাস্তবায়নের প্রস্তাব দেওয়া উচিত নয়।

আপনার সেটগুলি বাছাই করা তালিকা হিসাবে উপস্থাপন করা হয় এবং আপনি যদি আউটপুটটিকে বাছাই করা তালিকা হিসাবে সরবরাহ করতে চান তবে কোনওরকম আরও ভাল করা সম্ভব বলে আমি মনে করি না। আপনারা মৌলিকভাবে এবং বি এর প্রতিটি উপাদানকে দেখতে হবে । ন্যায্যতার আনুষ্ঠানিক স্কেচ: যদি এমন কোনও উপাদান থাকে যা আপনি দেখেননি তবে আপনি এটি আউটপুট করতে পারবেন না, তাই আপনি যদি কেবলমাত্র কোনও উপাদানটির সন্ধান করতে বাদ দিতে পারেন কেবলমাত্র যদি আপনি জানেন যে এটি A এবং B উভয় ক্ষেত্রে উপস্থিত রয়েছে , তবে আপনি কীভাবে জানতে পারবেন যে এর উপস্থিতিটির মূল্য বিবেচনা না করা হলে এটি উপস্থিত?ABAB


চমত্কার, আমাদের কি অন্যান্য বিকল্প আছে যদি সেটগুলি বাছাই করা তালিকাগুলি হিসাবে সঞ্চিত রাখতে হয় যে সীমাবদ্ধতা সরিয়ে ফেলা হয়?
ব্যবহারকারী 917279

2

যদি এ এবং বি সমান আকারের হয়, বিচ্ছিন্ন হয় এবং আন্তঃবিভক্ত হয় (যেমন, এ এর ​​মধ্যে বিজোড় সংখ্যা এবং বিতে সংখ্যাগুলিও) তবে লিনিয়ার সময়ে আইটেমের জোড়াযুক্ত তুলনা সম্ভবত সর্বোত্তম।

যদি A এবং B এ আইটেমগুলির ব্লক থাকে যা হ'ল A বা B এর একটিতে বা তাদের উভয়টিতে থাকে তবে উপ-রৈখিক সময়ের মধ্যে সেট পার্থক্য, ইউনিয়ন এবং ছেদটি গণনা করা সম্ভব। উদাহরণস্বরূপ, যদি A এবং B হুবহু একটি আইটেমে পৃথক হয়, তবে পার্থক্যটি ও (লগ এন) এ গণনা করা যেতে পারে।

http://arxiv.org/abs/1301.3388


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

1
গোশ, আপনি আমার মতো একই কাগজটি যুক্ত করেছেন (আমি, আপনার মতো, বরং) ... পরবর্তী বার আপনার লিঙ্কগুলির নাম দিন: ডি
রিয়েলজ স্লাও

@ সুমসন চমত্কার, আমার কাছে যা কিছু জ্ঞান (?) আছে, আমি সেগুলিকে বাছাই করা তালিকা হিসাবে উপস্থাপন করেছি, তবে বিনীতভাবে অন্যান্য পরামর্শগুলিও স্বাগত জানাব।
ব্যবহারকারী 917279

2

nABab¯a,b


1010

1
আর।, পয়েন্টটি মিস করে। একটি একক long32 টি উপাদান বা 1 byte, 8 টি উপাদান সংরক্ষণ করতে পারে । সুতরাং 1 এম এন্ট্রিগুলি কেবলমাত্র ~ 125K র্যামে সঞ্চয় করা যায়! সমস্যাটি কীভাবে বাস্তবায়িত হয় তার উপর নির্ভর করে
স্টোরেজটি

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

12MB? তাই না? পোস্টার জানিয়েছে যে তার কাছে মাত্র 2 টি সেট রয়েছে। পোস্টারটি তার সেটের স্পারসিটি / ঘনত্ব নির্দিষ্ট করে নি। এটি আমার উত্তরে নির্দেশিত আপনি কি ধরে নিচ্ছেন যে তার স্পারস সেট আছে? একটি সঠিক উত্তর নেই, পদ্ধতির বিকল্প বিকল্প হিসাবে চিহ্নিত করা হয়েছে যা পরিস্থিতিতে নির্ভর করে কার্যকর হতে পারে। এটি এই প্রসঙ্গে অস্বাভাবিকভাবে ব্যবহৃত হয় না ...
vzn

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