(কখন) হ্যাশ টেবিলের অনুসন্ধান ও (1) হয়?


70

এটি প্রায়শই বলা হয় যে হ্যাশ টেবিল লুক্কুল অবিচ্ছিন্ন সময়ে কাজ করে: আপনি হ্যাশ মানটি গণনা করুন, যা আপনাকে অ্যারে অনুসন্ধানের জন্য একটি সূচক দেয়। তবুও এটি সংঘর্ষকে উপেক্ষা করে; সবচেয়ে খারাপ ক্ষেত্রে, প্রতিটি আইটেম একই বালতিতে অবতরণ করে এবং দেখার সময়টি লিনিয়ার ( ) হয়ে যায় ।Θ(n)

ডেটাতে এমন কোনও শর্ত রয়েছে যা হ্যাশ টেবিলটিকে সত্যই ? এটি কি কেবলমাত্র গড়, বা একটি হ্যাশ টেবিলের ( 1 ) সবচেয়ে খারাপ ক্ষেত্রে সন্ধান করতে পারে?O(1)O(1)

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

পিএস ফলোআপ: হ্যাশ টেবিল অপারেশন ও (1) কোন ধরণের ডেটার জন্য?


3
আপনার সাথে থাকতে পারবে amortized এক্সেস সময়? সাধারণভাবে, হ্যাশ টেবিলের পারফরম্যান্স ভারসাম্যহীন হ্যাশট্যাবলগুলির জন্য আপনি কতটা ওভারহেড সহ্য করতে প্রস্তুত এবং প্রকৃত হ্যাশ মানগুলি কীভাবে বিতরণ করা হয় তার উপর নির্ভর করবে। O(1)
রাফায়েল

5
ওহ, বিটিডব্লিউ: আপনি তালিকার পরিবর্তে (ভারসাম্যযুক্ত) অনুসন্ধান গাছ ব্যবহার করে লিনিয়ার সবচেয়ে খারাপ-আচরণের বিষয়টি এড়াতে পারেন।
রাফায়েল

1
@ রাফেল আমি এমন উত্তরের সাথে খুব আগ্রহী হব যা ব্যাখ্যা করে (বিস্তৃত রেখা বরাবর) যখন আমি রীতিবিহীন উপর নির্ভর করতে পারি এবং কখন পারি না। হ্যাশ মানগুলি কীভাবে বিতরণ করা হয়, তা আমার প্রশ্নের সত্যিই অংশ: আমি কীভাবে জানতে পারি? আমি জানি হ্যাশ ফাংশনগুলি মানগুলি ভালভাবে বিতরণ করার কথা; তবে যদি তারা সর্বদা খারাপ কাজ করে তবে তা কখনই পৌঁছাতে পারে না, এটির কোনও অর্থ নেই। O(1)
গিলস

1
অকাল অপটিমাইজেশন সম্পর্কেও সাবধানতা অবলম্বন করুন; ছোট (বেশ কয়েক হাজার উপাদান) ডেটার জন্য আমি প্রায়শই ভারী ভারসাম্য বাইনারি গাছগুলি কম ওভারহেডের কারণে হ্যাশ টেবিলকে ছাপিয়ে দেখি (স্ট্রিংয়ের তুলনাগুলি স্ট্রিং হ্যাশগুলির তুলনায় অত্যন্ত সস্তা)। O(logn)
isturdy

উত্তর:


41

দুটি সেটিংস রয়েছে যার অধীনে আপনি খারাপ পরিস্থিতি বার পেতে পারেন ।O(1)

  1. যদি আপনার সেটআপ স্ট্যাটিক হয়, তাহলে FKS হ্যাশ আপনি খারাপ-কেস পাবেন তার গ্যারান্টি দেয়। আপনি যেমন ইঙ্গিত করেছেন, আপনার সেটিংস স্থির নয়।O(1)

  2. আপনি যদি কোকিল হ্যাশিং ব্যবহার করেন, তবে অনুসন্ধানগুলি এবং মুছে ফেলা হ'ল সবচেয়ে খারাপ পরিস্থিতি, তবে সন্নিবেশ কেবল ( 1 ) প্রত্যাশিত। মোট serোকানোর সংখ্যার উপর যদি আপনার উপরের আবদ্ধ থাকে এবং টেবিলের আকারটি প্রায় 25% বড় হতে পারে তবে কোকিল হ্যাশিং বেশ ভাল কাজ করে।O(1)O(1)

এখানে আরও তথ্য আছে


3
আপনি এফকেএস এবং কোকিলকে প্রসারিত করতে পারেন? দুটি পদই আমার কাছে নতুন।
গিলস

1
গতিশীল নিখুঁত হ্যাশিং সম্পর্কে কী? এটা আছে খারাপ-কেস লুক-এবং হে ( 1 ) amortized ঢোকানো এবং মুছে ফেলার। ( citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.30.8165 )O(1)O(1)
জো

2
এফকেএস হ'ল (ফ্রেডম্যান, কমলিস, সেজেমেরি) আর আদ্যক্ষর এবং কোকিল একটি ব্রিডের একটি প্রজাতির নাম। এটি এই ধরণের হ্যাশিংয়ের জন্য ব্যবহার করা হয়, কারণ কোকিল ছানাগুলি বাসা থেকে সিবিলিংয়ের ডিমগুলি ধাক্কা দেয়। এটি কিছুটা সাদৃশ্যযুক্ত যে কীভাবে এটির পদ্ধতিটি কার্য করে।
uli

1
@ সুরেশ: সত্যি? আমি ভেবেছিলাম আপনার নির্ভরশীল ফাংশনগুলির প্রয়োজন, যা আমি সর্বদা প্রসারণকারীগুলির প্রয়োজনের সাথে যুক্ত ছিল। আমি সংশোধন করেছি. আমার মন্তব্যটি কিছুটা মুছে ফেলবে। logn
লুই

1
এই উত্তরে আরও দরকারী মন্তব্য করার জন্য, যেমন @ সুরেশ উল্লেখ করেছেন যে, কোকিল হ্যাশিং তাত্ত্বিকভাবে বিশ্লেষণ করার জন্য ব্যবহৃত অভিনব (এবং বড়) হ্যাশ ফাংশন ছাড়াই ভাল কাজ করবে ।
লুই

21

এই উত্তরটি টিওওসিপি খণ্ড 3, সিএইচ 6.4 এর অংশগুলি সংক্ষিপ্তসার করে ।

ধরে আমরা মান একটি সেট আছে , এন যা আমরা একটি অ্যারের মধ্যে সঞ্চয় করতে চান একটি আকারের মি । আমরা একটি হ্যাশ ফাংশন নিয়োগ করি h : ভি [ 0 .. এম ) ; সাধারণত, এম | ভি | । আমরা কল α = VnAmh:V[0..M)M|V| লোড ফ্যাক্টরএরএকটি। এখানে আমরা প্রাকৃতিকএম=এমধরে নেব; ব্যবহারিক পরিস্থিতিতে, আমরামি«এম, যদিও, এবং নিচে ম্যাপ আছেমিনিজেদেরকে।α=nmAm=MmMm

hO(1)

[0..M)CnSCnU

চেইনিং

nm

CnS1+α2 and CnU1+α22.

লিনিয়ার প্রোব

v

h(v),h(v)1,,0,m1,,h(v)+1
vα1
CnS12(1+11α) and CnU12(1+(11α)2).
α<0.75

ডাবল হ্যাশিং

M

CnS1αln(11α) and CnU11α.

নোট করুন যে সারণীগুলি থেকে উপাদানগুলি সরিয়ে নেওয়া এবং প্রসারিত করার ক্ষেত্রে সংশ্লিষ্ট পদ্ধতির জন্য বিভিন্ন ডিগ্রি অসুবিধা রয়েছে।

O(1)αh


h
Hashtable


10

S{0,1,2,...,n}O(1)O(1)lSlxxSO(|l|)SO(|S|)O(|l|+|S|)O(|l||S|)O(log(|l|)|S|)O(|l|)l

O(|l|)

lUNSUxSllh:U{true,false}hh(x)=falsexUylh(y)=trueO(|l|)O(|U|)

lO(|U|)O(|1|)O(|U|)

Uh


O(|l|)O(|S|)O(|l||S|)

hh:U{false,true}h

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

9

O(1)

O(1)O(1)O(1)O(1)


একটি নিখুঁত হ্যাশ ফাংশন নিখুঁত হবে, তবে আমি কীভাবে এটি পাব? আমার কত খরচ হবে? এবং আমি কীভাবে জানব যে সংঘর্ষের সর্বাধিক বা প্রত্যাশিত সংখ্যাটি কী?
গিলস

2
@ গিলস একটি নিখুঁত হ্যাশ ফাংশন এমন কোনও ফাংশন যা সমস্ত সম্ভাব্য ইনপুটগুলির জন্য একটি অনন্য হ্যাশ তৈরি করবে। যদি আপনার সম্ভাব্য ইনপুটগুলি সীমাবদ্ধ (এবং অনন্য) হয় তবে এটি করা সহজ।
রাফে কেটলার

1
@ রাফেকিটলার আমার ইনপুটগুলি সাধারণত স্ট্রিং বা যৌগিক ডেটা স্ট্রাকচার এবং আমার ডেটাগুলি বিকশিত হওয়ার সাথে সাথে আমি সাধারণত এন্ট্রিগুলি যুক্ত করি এবং সরিয়ে রাখি। আমি কীভাবে এটির জন্য নিখুঁত হ্যাশ তৈরি করব?
গিলস

4
হ্যাঁ, তবে সেটাই কথা। ডোমেনের ব্যাপ্তির চেয়ে বড় হলে কোনও ডিটারমিনিস্টিক নিখুঁত হ্যাশ ফাংশন উপস্থিত থাকে না।
সুরেশ

@ সুরেশ: যদি কোনও নতুন হ্যাশ ফাংশন বাছাই করার অনুমতি দেওয়া হয় এবং যখনই সংঘর্ষ হয় তখন টেবিলের আকার বাড়িয়ে তোলা যায়, আপনি সর্বদা একটি (নিরস্তক) হ্যাশ ফাংশনটি খুঁজে পেতে পারেন যা ইতিমধ্যে টেবিলের মধ্যে থাকা ডেটার জন্য একটি নতুন আপনি যে আইটেমটি sertোকানোর চেষ্টা করছেন - তাতে কোনও সংঘর্ষ নেই (এটি "নিখুঁত")। এজন্য গতিশীল নিখুঁত হ্যাশিং পর্যায়ক্রমে একটি এলোমেলো নতুন হ্যাশ ফাংশনটি বেছে নেয়।
ডেভিড ক্যারি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.