زمان کنونی: ۰۳ دى ۱۴۰۳, ۰۸:۳۱ ب.ظ مهمان گرامی به انجمن مانشت خوش آمدید. برای استفاده از تمامی امکانات انجمن می‌توانید عضو شوید.
گزینه‌های شما (ورودثبت نام)

مرتب سازی آرایه تقریبا تکراری

ارسال:
  

alireza01 پرسیده:

مرتب سازی آرایه تقریبا تکراری



ممنون .
نقل قول این ارسال در یک پاسخ

۳
ارسال:
  

Pure Liveliness پاسخ داده:

RE: مرتب سازی آرایه تقریبا تکراری

(۲۷ بهمن ۱۳۹۵ ۰۲:۵۰ ب.ظ)alireza01 نوشته شده توسط:  

ممنون .

با [tex]\theta(n)[/tex] میشه مرتب کرد.
با پیمایش روی همه‌ی اعداد، تعداد هر عدد رو در یک Hashmap نگه می‌داریم. کافی است به هر عدد که می‌رسیم، بررسی کنیم اگر در مپ وجود نداشت، اضافه کنیم. اگر وجود داشت، value آن را یک واحد زیاد کنیم. مرتبه‌ی پیمایش روی کلیه‌ی اعداد [tex]\theta(n)[/tex] است.
طول (تعداد کلیدهای) مپ ماکزیمم [tex]k = \log(n)[/tex] است چرا که ماکزیمم این تعداد عدد متفاوت داریم. این k عددِ متمایز را می‌توان از مرتبه‌ی [tex]\theta(klog(k))=\theta(\log n\times\log(\log n))[/tex] که چون از [tex]\theta(n)[/tex] کمتر است، می‌توان از این مرحله چشمپوشی کرد.
در نهایت روی این لیست مرتب شده پیمایش می‌کنیم و برای هر عدد، به تعدادِ آن عدد (که قبلاً در مپ نگه داشتیم) می‌نویسیم.
نقل قول این ارسال در یک پاسخ

ارسال:
  

msour44 پاسخ داده:

RE: مرتب سازی آرایه تقریبا تکراری

(۲۷ بهمن ۱۳۹۵ ۰۹:۰۹ ب.ظ)Pure Liveliness نوشته شده توسط:  
(27 بهمن ۱۳۹۵ ۰۲:۵۰ ب.ظ)alireza01 نوشته شده توسط:  

ممنون .

با [tex]\theta(n)[/tex] میشه مرتب کرد.
با پیمایش روی همه‌ی اعداد، تعداد هر عدد رو در یک Hashmap نگه می‌داریم. کافی است به هر عدد که می‌رسیم، بررسی کنیم اگر در مپ وجود نداشت، اضافه کنیم. اگر وجود داشت، value آن را یک واحد زیاد کنیم. مرتبه‌ی پیمایش روی کلیه‌ی اعداد [tex]\theta(n)[/tex] است.
طول (تعداد کلیدهای) مپ ماکزیمم [tex]k = \log(n)[/tex] است چرا که ماکزیمم این تعداد عدد متفاوت داریم. این k عددِ متمایز را می‌توان از مرتبه‌ی [tex]\theta(klog(k))=\theta(\log n\times\log(\log n))[/tex] که چون از [tex]\theta(n)[/tex] کمتر است، می‌توان از این مرحله چشمپوشی کرد.
در نهایت روی این لیست مرتب شده پیمایش می‌کنیم و برای هر عدد، به تعدادِ آن عدد (که قبلاً در مپ نگه داشتیم) می‌نویسیم.
ببخشید این روشی که شما گفتید مقایسه ای محسوب میشه؟
تقریبا شبیه روش مرتب سازی شمارشی نیست؟
یافتن تمامی ارسال‌های این کاربر
نقل قول این ارسال در یک پاسخ

ارسال:
  

Behnam‌ پاسخ داده:

RE: مرتب سازی آرایه تقریبا تکراری

(۲۷ بهمن ۱۳۹۵ ۰۹:۵۲ ب.ظ)msour44 نوشته شده توسط:  
(27 بهمن ۱۳۹۵ ۰۹:۰۹ ب.ظ)Pure Liveliness نوشته شده توسط:  
(27 بهمن ۱۳۹۵ ۰۲:۵۰ ب.ظ)alireza01 نوشته شده توسط:  

ممنون .

با [tex]\theta(n)[/tex] میشه مرتب کرد.
با پیمایش روی همه‌ی اعداد، تعداد هر عدد رو در یک Hashmap نگه می‌داریم. کافی است به هر عدد که می‌رسیم، بررسی کنیم اگر در مپ وجود نداشت، اضافه کنیم. اگر وجود داشت، value آن را یک واحد زیاد کنیم. مرتبه‌ی پیمایش روی کلیه‌ی اعداد [tex]\theta(n)[/tex] است.
طول (تعداد کلیدهای) مپ ماکزیمم [tex]k = \log(n)[/tex] است چرا که ماکزیمم این تعداد عدد متفاوت داریم. این k عددِ متمایز را می‌توان از مرتبه‌ی [tex]\theta(klog(k))=\theta(\log n\times\log(\log n))[/tex] که چون از [tex]\theta(n)[/tex] کمتر است، می‌توان از این مرحله چشمپوشی کرد.
در نهایت روی این لیست مرتب شده پیمایش می‌کنیم و برای هر عدد، به تعدادِ آن عدد (که قبلاً در مپ نگه داشتیم) می‌نویسیم.
ببخشید این روشی که شما گفتید مقایسه ای محسوب میشه؟
تقریبا شبیه روش مرتب سازی شمارشی نیست؟
به نظرم فرق دارند چون اولاً در مرتب‌سازی شمارشی، طول بازه باید محدود باشد در حالی که در اینجا محدودیتی وجود ندارد. همچنین در مرتب‌سازی شمارشی، هیچ مقایسه‌ای صورت نمی‌گیرد در حالی که در اینجا، لیستِ بدست آمده از hashmap رو با یک روش مقایسه‌ای (مثل merge sort) مرتب می‌کنیم. اگر تنوع اعداد به جای [tex]\log(n)[/tex] مثلاً [tex]\frac{n}{100}[/tex] بود، پیچیدگی روش گفته شده میشد [tex]\theta(n\cdot\log(n))[/tex] در حالی که در مرتب‌سازی شمارشی همون [tex]\theta(n)[/tex] می‌شد.
یافتن تمامی ارسال‌های این کاربر
نقل قول این ارسال در یک پاسخ

ارسال:
  

msour44 پاسخ داده:

RE: مرتب سازی آرایه تقریبا تکراری

(۲۷ بهمن ۱۳۹۵ ۱۰:۰۸ ب.ظ)Behnam‌ نوشته شده توسط:  
(27 بهمن ۱۳۹۵ ۰۹:۵۲ ب.ظ)msour44 نوشته شده توسط:  
(27 بهمن ۱۳۹۵ ۰۹:۰۹ ب.ظ)Pure Liveliness نوشته شده توسط:  
(27 بهمن ۱۳۹۵ ۰۲:۵۰ ب.ظ)alireza01 نوشته شده توسط:  

ممنون .

با [tex]\theta(n)[/tex] میشه مرتب کرد.
با پیمایش روی همه‌ی اعداد، تعداد هر عدد رو در یک Hashmap نگه می‌داریم. کافی است به هر عدد که می‌رسیم، بررسی کنیم اگر در مپ وجود نداشت، اضافه کنیم. اگر وجود داشت، value آن را یک واحد زیاد کنیم. مرتبه‌ی پیمایش روی کلیه‌ی اعداد [tex]\theta(n)[/tex] است.
طول (تعداد کلیدهای) مپ ماکزیمم [tex]k = \log(n)[/tex] است چرا که ماکزیمم این تعداد عدد متفاوت داریم. این k عددِ متمایز را می‌توان از مرتبه‌ی [tex]\theta(klog(k))=\theta(\log n\times\log(\log n))[/tex] که چون از [tex]\theta(n)[/tex] کمتر است، می‌توان از این مرحله چشمپوشی کرد.
در نهایت روی این لیست مرتب شده پیمایش می‌کنیم و برای هر عدد، به تعدادِ آن عدد (که قبلاً در مپ نگه داشتیم) می‌نویسیم.
ببخشید این روشی که شما گفتید مقایسه ای محسوب میشه؟
تقریبا شبیه روش مرتب سازی شمارشی نیست؟
به نظرم فرق دارند چون اولاً در مرتب‌سازی شمارشی، طول بازه باید محدود باشد در حالی که در اینجا محدودیتی وجود ندارد. همچنین در مرتب‌سازی شمارشی، هیچ مقایسه‌ای صورت نمی‌گیرد در حالی که در اینجا، لیستِ بدست آمده از hashmap رو با یک روش مقایسه‌ای (مثل merge sort) مرتب می‌کنیم. اگر تنوع اعداد به جای [tex]\log(n)[/tex] مثلاً [tex]\frac{n}{100}[/tex] بود، پیچیدگی روش گفته شده میشد [tex]\theta(n\cdot\log(n))[/tex] در حالی که در مرتب‌سازی شمارشی همون [tex]\theta(n)[/tex] می‌شد.
ممنون از پاسختان
چرا در hash تعداد مدخل ها رو لگاریتم n میگیرد نباید به اندازه بزرگترین عدد موجود در ارایه باشه که ممکنه نسبت به n نمایی باشه؟منظورم اینکه اندیس ها نباید اعداد متوالی باشه ؟درست n عدد داریم با ضریب تکرار لگاریتمی ولی اگه از Hashاستفاده کنیم برای ذخیره تعداد تکرار هر عدد نباید اندیس رو عدد و درایه ان را تعداد تکرار تصور کنیم منظورت چیز دیگری است؟
ببخشید که وقت تونو میگیرم ولی اگه اشتباه نکنم این تست سال ۸۹ نرم افزاره که هادی یوسفی جوابشو گزینه ۳ گفته به این صورت که با nعدد داده شده یک BST متوازن می سازیم ولی در هر نود تعداد تکرار ان را ذخیره می کنیم که ارتفاع این درخت loglogn میشه و مرتبه ساخت n.loglogn سپس درخت را به صورت میان ترتیب پیمایش میکنیم که مرتبه کل میشه n.loglogn مدرسان هم همین گزینه رو گفته با همین استدلال تقریبا مشابه با هادی یوسفی.
ولی روشی که من این تست و اولین بار جواب دادم این بود که می توان از متن سوال پی برد که logn لیست مرتب شده با توجه به تکرار هر عدد در بدترین حالت داریم و اینکه مرتبه ادغام kلیست مرتب در حداقل n.logk است پس مرتبه کل میشه n.loglogn
موفق باشید
یافتن تمامی ارسال‌های این کاربر
نقل قول این ارسال در یک پاسخ

ارسال:
  

Pure Liveliness پاسخ داده:

RE: مرتب سازی آرایه تقریبا تکراری

(۲۷ بهمن ۱۳۹۵ ۱۱:۴۴ ب.ظ)msour44 نوشته شده توسط:  ممنون از پاسختان
چرا در hash تعداد مدخل ها رو لگاریت n میگیرد نباید به اندازه بزرگترین عدد موجود در ارایه باشه که ممکنه نسبت به n نمایی باشه؟منظورم اینکه اندیس ها نباید اعداد متوالی باشه ؟درست n عدد داریم با ضریب تکرار لگاریتمی ولی اگه از Hashاستفاده کنیم برای ذخیره تعداد تکرار هر عدد نباید اندیس رو عدد و درایه ان را تعداد تکرار تصور کنیم منظورت چیز دیگری است؟
ببخشید که وقت تونو میگیرم ولی اگه اشتباه نکنم این تست سال ۸۹ نرم افزاره که هادی یوسفی جوابشو گزینه ۳ گفته به این صورت که با nعدد داده شده یک BST متوازن می سازیم ولی در هر نود تعداد تکرار ان را ذخیره می کنیم که ارتفاع این درخت loglogn میشه و مرتبه ساخت n.loglogn سپس درخت را به صورت میان ترتیب پیمایش میکنیم که مرتبه کل میشه n.loglogn مدرسان هم همین گزینه رو گفته با همین استدلال تقریبا مشابه با هادی یوسفی.
ولی روشی که من این تست و اولین بار جواب دادم این بود که می توان از متن سوال پی برد که logn لیست مرتب شده با توجه به تکرار هر عدد در بدترین حالت داریم و اینکه مرتبه ادغام kلیست مرتب در حداقل n.logk است پس مرتبه کل میشه n.loglogn
موفق باشید
توی hash map اعدادی که یکی هستن توی یه خونه نگاشت میشن در نتیجه تمامی اعداد یکسان در یک خونه هستن و چون توی صورت سوال گفته حداکثر تعداد اعداد یکسان [tex]\log n[/tex] تا هست در هر مدخل نهایتا به همین مقدار عدد وجود داره.
نمیدونم باید نگاه کنم. روشی که گفتید منطقی هست اما روشی که من نوشتم هم منطقی هست با هزینه ی کمتر. نگاه میکنم مینویسم اینجا.
یافتن تمامی ارسال‌های این کاربر
نقل قول این ارسال در یک پاسخ

ارسال:
  

Behnam‌ پاسخ داده:

RE: مرتب سازی آرایه تقریبا تکراری

(۲۷ بهمن ۱۳۹۵ ۱۱:۴۴ ب.ظ)msour44 نوشته شده توسط:  
(27 بهمن ۱۳۹۵ ۱۰:۰۸ ب.ظ)Behnam‌ نوشته شده توسط:  
(27 بهمن ۱۳۹۵ ۰۹:۵۲ ب.ظ)msour44 نوشته شده توسط:  
(27 بهمن ۱۳۹۵ ۰۹:۰۹ ب.ظ)Pure Liveliness نوشته شده توسط:  
(27 بهمن ۱۳۹۵ ۰۲:۵۰ ب.ظ)alireza01 نوشته شده توسط:  

ممنون .

با [tex]\theta(n)[/tex] میشه مرتب کرد.
با پیمایش روی همه‌ی اعداد، تعداد هر عدد رو در یک Hashmap نگه می‌داریم. کافی است به هر عدد که می‌رسیم، بررسی کنیم اگر در مپ وجود نداشت، اضافه کنیم. اگر وجود داشت، value آن را یک واحد زیاد کنیم. مرتبه‌ی پیمایش روی کلیه‌ی اعداد [tex]\theta(n)[/tex] است.
طول (تعداد کلیدهای) مپ ماکزیمم [tex]k = \log(n)[/tex] است چرا که ماکزیمم این تعداد عدد متفاوت داریم. این k عددِ متمایز را می‌توان از مرتبه‌ی [tex]\theta(klog(k))=\theta(\log n\times\log(\log n))[/tex] که چون از [tex]\theta(n)[/tex] کمتر است، می‌توان از این مرحله چشمپوشی کرد.
در نهایت روی این لیست مرتب شده پیمایش می‌کنیم و برای هر عدد، به تعدادِ آن عدد (که قبلاً در مپ نگه داشتیم) می‌نویسیم.
ببخشید این روشی که شما گفتید مقایسه ای محسوب میشه؟
تقریبا شبیه روش مرتب سازی شمارشی نیست؟
به نظرم فرق دارند چون اولاً در مرتب‌سازی شمارشی، طول بازه باید محدود باشد در حالی که در اینجا محدودیتی وجود ندارد. همچنین در مرتب‌سازی شمارشی، هیچ مقایسه‌ای صورت نمی‌گیرد در حالی که در اینجا، لیستِ بدست آمده از hashmap رو با یک روش مقایسه‌ای (مثل merge sort) مرتب می‌کنیم. اگر تنوع اعداد به جای [tex]\log(n)[/tex] مثلاً [tex]\frac{n}{100}[/tex] بود، پیچیدگی روش گفته شده میشد [tex]\theta(n\cdot\log(n))[/tex] در حالی که در مرتب‌سازی شمارشی همون [tex]\theta(n)[/tex] می‌شد.
ممنون از پاسختان
چرا در hash تعداد مدخل ها رو لگاریتم n میگیرد نباید به اندازه بزرگترین عدد موجود در ارایه باشه که ممکنه نسبت به n نمایی باشه؟منظورم اینکه اندیس ها نباید اعداد متوالی باشه ؟درست n عدد داریم با ضریب تکرار لگاریتمی ولی اگه از Hashاستفاده کنیم برای ذخیره تعداد تکرار هر عدد نباید اندیس رو عدد و درایه ان را تعداد تکرار تصور کنیم منظورت چیز دیگری است؟
ببخشید که وقت تونو میگیرم ولی اگه اشتباه نکنم این تست سال ۸۹ نرم افزاره که هادی یوسفی جوابشو گزینه ۳ گفته به این صورت که با nعدد داده شده یک BST متوازن می سازیم ولی در هر نود تعداد تکرار ان را ذخیره می کنیم که ارتفاع این درخت loglogn میشه و مرتبه ساخت n.loglogn سپس درخت را به صورت میان ترتیب پیمایش میکنیم که مرتبه کل میشه n.loglogn مدرسان هم همین گزینه رو گفته با همین استدلال تقریبا مشابه با هادی یوسفی.
ولی روشی که من این تست و اولین بار جواب دادم این بود که می توان از متن سوال پی برد که logn لیست مرتب شده با توجه به تکرار هر عدد در بدترین حالت داریم و اینکه مرتبه ادغام kلیست مرتب در حداقل n.logk است پس مرتبه کل میشه n.loglogn
موفق باشید

اندازه‌ی داده‌ها (رِنجِ اعداد) زیاد مهم نیست و هندل میشه ولی چیزی که مهم هست احتمال رخ دادن بدترین حالت هست. مرتبه‌ی جستجو و درج در هش‌مپ در حالت میانگین [tex]\theta(1)[/tex] هست پس جستجو و درج n عنصر هم از مرتبه‌ی [tex]\theta(n)[/tex] خواهد بود.
ولی ممکن هست همه‌ی اعداد (کلیدها) تنها به یک خونه از هش‌مپ نگاشت بشن. اینکه دو (یا بیشتر) کلید مختلف به یک خونه نگاشت بشن طبیعی هست و اینا رو به صورت linkedlist نگه می‌دارند. در واقع بدترین برای درج یا جستجوی n عدد ممکنه [tex]O(n)[/tex]هم بشه که البته بسته به کلیدها (اگر کلیدها قابل مقایسه باشند) می‌توان به جای لیست به صورت درخت پیاده‌سازی کرد و بدترین حالت رو کرد [tex]O(\log n)[/tex] (بدترین حالت یعنی اینکه به ازای یک کلید، یک خونه برگردونده میشه ولی اون خونه بیش از یک value داره و باید کل آیتم‌هاش رو گشت).
از طرف دیگه برای n داده‌ی ورودی، با احتمال بیش از [tex]1-\frac{1}{n}[/tex] هیچ خونه‌ی هش‌مپ بیش از [tex]\log(n)[/tex] داده (مقدار) نخواهد داشت (که در اصل در این مسأله صرفا [tex]\log(n)[/tex] داده‌ی ورودی داریم، پس خونه‌های هش‌مپ بیش از [tex]\log(\log n)[/tex] مقدار نخواهند داشت که برای درج یا جستجوی n عنصر با ماکزیمم [tex]\log n[/tex] عنصر متفاوت در این سوال ماکزیمم مرتبه‌ی [tex]nlog(\log n)[/tex] خواهیم داشت ولی در کل، مخصوصاً با این تعدادِ کم داده‌ی متمایز مرتبه‌ی درج و جستجوی هش‌مپ رو [tex]O(1)[/tex] می‌گیرند.

و اما در مورد روش شما، نمی‌دونم از کجا گفتید لیست مرتب شده داریم. فرض کنید که [tex]\log(n)[/tex] عدد متمایز داریم و تعداد تکرار این اعداد هم بر فرض برابر هستند و به صورت نزولی اومدند، مثلا n=8 و در نتیجه ۳ عدد متمایز داریم. فرض کنید به این صورت اومدند:
۳,۲,۱,۳,۲,۱,۳,۲,۱,۳,۲,۱
الان اینجا هیچ لیست مرتب شده وجود نداره که شما صرفاً ادغام کنید.

(۲۸ بهمن ۱۳۹۵ ۰۲:۵۲ ق.ظ)alireza01 نوشته شده توسط:  سلام . نظر و جواب دوست عزیزمون Pure Liveliness رو قبول ندارم ، چون در صورت تست گفته شده که مرتب سازی باید مبتنی بر مقایسه باشه ، روش Hash که ایشون استفاده کردن حتی با بهترین تابع ابتکار باز هم ایده مقایسه ای نداره ( این ایده که در مدخل مورد نظر مقدار را افزایش یا وارد کنیم اصلا یک ایده مقایسه ای نیست ، این ایده در اصل همان روش مرتب سازی شمارشی است با یک تفاوت در طول بازه آن و تابع ابتکار ) ، لیست بیشتر الگوریتم هایی که مبتنی بر مقایسه هستند رو بنده استخراج کردم که در جدول زیر میبینید که بهترین زمان متوسط همان [tex]\theta(nlogn)[/tex] است .


روشی که میشه بهش استناد کرد اینه که ما حداکثر [tex]\log n[/tex] عدد متمایز داریم ، یک آرایه دو بعدی کمکی به نام TEMP به همین طول تولید کرده و با مرتبه زمانی [tex]O(n)[/tex] اعداد منحصر به فرد به پیدا کرده و به همراه فرکانس ( تعداد تکرار های آنها ) درون آرایه جدید قرار میدهیم . حال ما [tex]\log n[/tex] عدد داریم ، با هزینه [tex]nlog(\log n)[/tex] آرایه جدید را مرتب میکنیم . سپس بر اساس فرکانس آنها را در آرایه قبلی وارد میکنیم که مرتبه زمانی کلی برابر است با [tex]\theta(nloglogn\: +\: n)\: =\: \theta(nloglogn)[/tex] است .

اگر اشتباه میکنم خوشحال میشم بفرمایید . از پاسخم مطمعن نیستم .

این لزوماً درست نیست که مقایسه‌ای نمیتونه از [tex]\theta(nlogn)[/tex] بهتر باشه وقتی توو صورت سؤال برای توزیع داده‌ها شرط گذاشته. مسائل زیادی وجود داره که مثلا اعداد مسأله در قالب لیست‌های مرتب شده‌ی هم‌اندازه یا غیرهم‌اندازه و ... هستند که بسته به نوع سوال میشه از روش مقایسه‌ای استفاده کرد و مرتبه‌های مختلفی داشت.
ضمناً روش شما دقیقاً همون روش ایشون هست با این تفاوت که صرفاً شما اومدید نحوه‌ی پیاده‌سازی تابع هش‌مپ رو به صورت آرایه درآوردید که در این صورت اندازه‌ی آرایه‌تون باید در ابعاد (رِنج) n باشه که ممکن هست عملی نباشه. ممکن هست شما صرفاً فقط دو عدد متمایز داشته باشید ولی بازه‌ی اون‌ها بزرگ باشه (مثلا یکی ۰ و یکی [tex]10^{12}[/tex]).
یافتن تمامی ارسال‌های این کاربر
نقل قول این ارسال در یک پاسخ

ارسال:
  

alireza01 پاسخ داده:

RE: مرتب سازی آرایه تقریبا تکراری

ممنون از وقت گذاشتن و پاسخگویی تون ، نمیدونم چرا پستم پاک شد.
یافتن تمامی ارسال‌های این کاربر
نقل قول این ارسال در یک پاسخ

ارسال:
  

Behnam‌ پاسخ داده:

RE: مرتب سازی آرایه تقریبا تکراری

(۲۸ بهمن ۱۳۹۵ ۰۳:۳۰ ق.ظ)alireza01 نوشته شده توسط:  ممنون از وقت گذاشتن و پاسخگویی تون ، نمیدونم چرا پستم پاک شد.

من هم تعجب می‌کنم پستتون پاک شده، چون هیچ کدوم از مدیرها هم پاک نکردند (و الا متوجه میشدم).
به مدیر این بخش میگم بررسی کنه.
یافتن تمامی ارسال‌های این کاربر
نقل قول این ارسال در یک پاسخ

ارسال: #۱۰
  

Pure Liveliness پاسخ داده:

RE: مرتب سازی آرایه تقریبا تکراری

(۲۸ بهمن ۱۳۹۵ ۰۳:۳۰ ق.ظ)alireza01 نوشته شده توسط:  ممنون از وقت گذاشتن و پاسخگویی تون ، نمیدونم چرا پستم پاک شد.
خودتون حذف کردید. شاید دستتون خورده.
یافتن تمامی ارسال‌های این کاربر
نقل قول این ارسال در یک پاسخ

ارسال: #۱۱
  

msour44 پاسخ داده:

RE: مرتب سازی آرایه تقریبا تکراری

(۲۸ بهمن ۱۳۹۵ ۰۳:۰۹ ق.ظ)Behnam‌ نوشته شده توسط:  
(27 بهمن ۱۳۹۵ ۱۱:۴۴ ب.ظ)msour44 نوشته شده توسط:  
(27 بهمن ۱۳۹۵ ۱۰:۰۸ ب.ظ)Behnam‌ نوشته شده توسط:  
(27 بهمن ۱۳۹۵ ۰۹:۵۲ ب.ظ)msour44 نوشته شده توسط:  
(27 بهمن ۱۳۹۵ ۰۹:۰۹ ب.ظ)Pure Liveliness نوشته شده توسط:  با [tex]\theta(n)[/tex] میشه مرتب کرد.
با پیمایش روی همه‌ی اعداد، تعداد هر عدد رو در یک Hashmap نگه می‌داریم. کافی است به هر عدد که می‌رسیم، بررسی کنیم اگر در مپ وجود نداشت، اضافه کنیم. اگر وجود داشت، value آن را یک واحد زیاد کنیم. مرتبه‌ی پیمایش روی کلیه‌ی اعداد [tex]\theta(n)[/tex] است.
طول (تعداد کلیدهای) مپ ماکزیمم [tex]k = \log(n)[/tex] است چرا که ماکزیمم این تعداد عدد متفاوت داریم. این k عددِ متمایز را می‌توان از مرتبه‌ی [tex]\theta(klog(k))=\theta(\log n\times\log(\log n))[/tex] که چون از [tex]\theta(n)[/tex] کمتر است، می‌توان از این مرحله چشمپوشی کرد.
در نهایت روی این لیست مرتب شده پیمایش می‌کنیم و برای هر عدد، به تعدادِ آن عدد (که قبلاً در مپ نگه داشتیم) می‌نویسیم.
ببخشید این روشی که شما گفتید مقایسه ای محسوب میشه؟
تقریبا شبیه روش مرتب سازی شمارشی نیست؟
به نظرم فرق دارند چون اولاً در مرتب‌سازی شمارشی، طول بازه باید محدود باشد در حالی که در اینجا محدودیتی وجود ندارد. همچنین در مرتب‌سازی شمارشی، هیچ مقایسه‌ای صورت نمی‌گیرد در حالی که در اینجا، لیستِ بدست آمده از hashmap رو با یک روش مقایسه‌ای (مثل merge sort) مرتب می‌کنیم. اگر تنوع اعداد به جای [tex]\log(n)[/tex] مثلاً [tex]\frac{n}{100}[/tex] بود، پیچیدگی روش گفته شده میشد [tex]\theta(n\cdot\log(n))[/tex] در حالی که در مرتب‌سازی شمارشی همون [tex]\theta(n)[/tex] می‌شد.
ممنون از پاسختان
چرا در hash تعداد مدخل ها رو لگاریتم n میگیرد نباید به اندازه بزرگترین عدد موجود در ارایه باشه که ممکنه نسبت به n نمایی باشه؟منظورم اینکه اندیس ها نباید اعداد متوالی باشه ؟درست n عدد داریم با ضریب تکرار لگاریتمی ولی اگه از Hashاستفاده کنیم برای ذخیره تعداد تکرار هر عدد نباید اندیس رو عدد و درایه ان را تعداد تکرار تصور کنیم منظورت چیز دیگری است؟
ببخشید که وقت تونو میگیرم ولی اگه اشتباه نکنم این تست سال ۸۹ نرم افزاره که هادی یوسفی جوابشو گزینه ۳ گفته به این صورت که با nعدد داده شده یک BST متوازن می سازیم ولی در هر نود تعداد تکرار ان را ذخیره می کنیم که ارتفاع این درخت loglogn میشه و مرتبه ساخت n.loglogn سپس درخت را به صورت میان ترتیب پیمایش میکنیم که مرتبه کل میشه n.loglogn مدرسان هم همین گزینه رو گفته با همین استدلال تقریبا مشابه با هادی یوسفی.
ولی روشی که من این تست و اولین بار جواب دادم این بود که می توان از متن سوال پی برد که logn لیست مرتب شده با توجه به تکرار هر عدد در بدترین حالت داریم و اینکه مرتبه ادغام kلیست مرتب در حداقل n.logk است پس مرتبه کل میشه n.loglogn
موفق باشید

اندازه‌ی داده‌ها (رِنجِ اعداد) زیاد مهم نیست و هندل میشه ولی چیزی که مهم هست احتمال رخ دادن بدترین حالت هست. مرتبه‌ی جستجو و درج در هش‌مپ در حالت میانگین [tex]\theta(1)[/tex] هست پس جستجو و درج n عنصر هم از مرتبه‌ی [tex]\theta(n)[/tex] خواهد بود.
ولی ممکن هست همه‌ی اعداد (کلیدها) تنها به یک خونه از هش‌مپ نگاشت بشن. اینکه دو (یا بیشتر) کلید مختلف به یک خونه نگاشت بشن طبیعی هست و اینا رو به صورت linkedlist نگه می‌دارند. در واقع بدترین برای درج یا جستجوی n عدد ممکنه [tex]O(n)[/tex]هم بشه که البته بسته به کلیدها (اگر کلیدها قابل مقایسه باشند) می‌توان به جای لیست به صورت درخت پیاده‌سازی کرد و بدترین حالت رو کرد [tex]O(\log n)[/tex] (بدترین حالت یعنی اینکه به ازای یک کلید، یک خونه برگردونده میشه ولی اون خونه بیش از یک value داره و باید کل آیتم‌هاش رو گشت).
از طرف دیگه برای n داده‌ی ورودی، با احتمال بیش از [tex]1-\frac{1}{n}[/tex] هیچ خونه‌ی هش‌مپ بیش از [tex]\log(n)[/tex] داده (مقدار) نخواهد داشت (که در اصل در این مسأله صرفا [tex]\log(n)[/tex] داده‌ی ورودی داریم، پس خونه‌های هش‌مپ بیش از [tex]\log(\log n)[/tex] مقدار نخواهند داشت که برای درج یا جستجوی n عنصر با ماکزیمم [tex]\log n[/tex] عنصر متفاوت در این سوال ماکزیمم مرتبه‌ی [tex]nlog(\log n)[/tex] خواهیم داشت ولی در کل، مخصوصاً با این تعدادِ کم داده‌ی متمایز مرتبه‌ی درج و جستجوی هش‌مپ رو [tex]O(1)[/tex] می‌گیرند.

و اما در مورد روش شما، نمی‌دونم از کجا گفتید لیست مرتب شده داریم. فرض کنید که [tex]\log(n)[/tex] عدد متمایز داریم و تعداد تکرار این اعداد هم بر فرض برابر هستند و به صورت نزولی اومدند، مثلا n=8 و در نتیجه ۳ عدد متمایز داریم. فرض کنید به این صورت اومدند:
۳,۲,۱,۳,۲,۱,۳,۲,۱,۳,۲,۱
الان اینجا هیچ لیست مرتب شده وجود نداره که شما صرفاً ادغام کنید.

(۲۸ بهمن ۱۳۹۵ ۰۲:۵۲ ق.ظ)alireza01 نوشته شده توسط:  سلام . نظر و جواب دوست عزیزمون Pure Liveliness رو قبول ندارم ، چون در صورت تست گفته شده که مرتب سازی باید مبتنی بر مقایسه باشه ، روش Hash که ایشون استفاده کردن حتی با بهترین تابع ابتکار باز هم ایده مقایسه ای نداره ( این ایده که در مدخل مورد نظر مقدار را افزایش یا وارد کنیم اصلا یک ایده مقایسه ای نیست ، این ایده در اصل همان روش مرتب سازی شمارشی است با یک تفاوت در طول بازه آن و تابع ابتکار ) ، لیست بیشتر الگوریتم هایی که مبتنی بر مقایسه هستند رو بنده استخراج کردم که در جدول زیر میبینید که بهترین زمان متوسط همان [tex]\theta(nlogn)[/tex] است .


روشی که میشه بهش استناد کرد اینه که ما حداکثر [tex]\log n[/tex] عدد متمایز داریم ، یک آرایه دو بعدی کمکی به نام TEMP به همین طول تولید کرده و با مرتبه زمانی [tex]O(n)[/tex] اعداد منحصر به فرد به پیدا کرده و به همراه فرکانس ( تعداد تکرار های آنها ) درون آرایه جدید قرار میدهیم . حال ما [tex]\log n[/tex] عدد داریم ، با هزینه [tex]nlog(\log n)[/tex] آرایه جدید را مرتب میکنیم . سپس بر اساس فرکانس آنها را در آرایه قبلی وارد میکنیم که مرتبه زمانی کلی برابر است با [tex]\theta(nloglogn\: +\: n)\: =\: \theta(nloglogn)[/tex] است .

اگر اشتباه میکنم خوشحال میشم بفرمایید . از پاسخم مطمعن نیستم .

این لزوماً درست نیست که مقایسه‌ای نمیتونه از [tex]\theta(nlogn)[/tex] بهتر باشه وقتی توو صورت سؤال برای توزیع داده‌ها شرط گذاشته. مسائل زیادی وجود داره که مثلا اعداد مسأله در قالب لیست‌های مرتب شده‌ی هم‌اندازه یا غیرهم‌اندازه و ... هستند که بسته به نوع سوال میشه از روش مقایسه‌ای استفاده کرد و مرتبه‌های مختلفی داشت.
ضمناً روش شما دقیقاً همون روش ایشون هست با این تفاوت که صرفاً شما اومدید نحوه‌ی پیاده‌سازی تابع هش‌مپ رو به صورت آرایه درآوردید که در این صورت اندازه‌ی آرایه‌تون باید در ابعاد (رِنج) n باشه که ممکن هست عملی نباشه. ممکن هست شما صرفاً فقط دو عدد متمایز داشته باشید ولی بازه‌ی اون‌ها بزرگ باشه (مثلا یکی ۰ و یکی [tex]10^{12}[/tex]).
اینکه از کجا لیست های مرتب بدست میشه اورد به اینصورت که اگه تعداد اعداد متمایز رو logn بگیریم با فرض برابر بودن تعداد هر کدام یعنی اندازه هر لیست تقریبا سقف n/long است بعد از روش افراز مرتب سازی سریع به صورت تصادفی استفاده کنیم تا جایی که اندازه زیرلیست ها n/logn بشه می تونیم تمامی لیست های مرتب رو بدست بیاریم که هزینه افراز هم در این حالت nloglogn میشه بعد هم ادغام که هزینه اون هم n loglogn است
البته این حالت کمترین تعداد لیست رو شامل میشه پس nloglonn درواقع کمترین هزینه است البته با این روش.
اینکه فرمودین رنج اعداد مهم نیست و هندل میشه برای من استرسی ایجاد کرد که دوباره باید مبحٍث hash بخونم.
و اینکه گفتید در کل مخصوصا با این تعداد کم داده متمایز مرتبه درج و جستجو ی هش مپ را (۱) O میگیرند استرس دیگریست.
ممنون از اطلاعاتتان و اینکه من تاکیدی بر درستی روش خود ندارم فقط منظورم این بود که اولین ایده این روش به ذهن رسید. باز هم ممنون.
یافتن تمامی ارسال‌های این کاربر
نقل قول این ارسال در یک پاسخ



موضوع‌های مرتبط با این موضوع...
موضوع: نویسنده پاسخ: بازدید: آخرین ارسال
  چه جوری با سطح زبان انگلیسی تقریبا پایین رفرنس بخونیم؟ saharitst ۰ ۱,۶۱۷ ۲۱ آبان ۱۴۰۰ ۰۴:۱۱ ب.ظ
آخرین ارسال: saharitst
  پکیج آموزشی طراحی وب + فارسی سازی وردپرس + سئو Happiness.72 ۶ ۶,۹۸۷ ۱۸ بهمن ۱۳۹۹ ۰۱:۱۵ ب.ظ
آخرین ارسال: saqarmoshtaq
  تکمیل قطعه کد مجموع آرایه Xzrix ۰ ۱,۵۱۹ ۰۲ دى ۱۳۹۹ ۰۷:۱۹ ب.ظ
آخرین ارسال: Xzrix
  مرتب سازی سریع تصادفی چیست؟ Xzrix ۰ ۱,۶۴۷ ۱۴ آذر ۱۳۹۹ ۰۷:۲۲ ب.ظ
آخرین ارسال: Xzrix
  شبیه سازی مقاله Q-Learning kadoos ۱۶ ۱۷,۷۹۸ ۲۵ آبان ۱۳۹۹ ۰۹:۱۹ ب.ظ
آخرین ارسال: nasim.nasim۱
  کتاب شبیه سازی آمنت omnet++ berkeley ۱ ۴,۲۴۷ ۰۴ اردیبهشت ۱۳۹۹ ۱۲:۳۳ ق.ظ
آخرین ارسال: محمد رستمی
  مجموعه آموزش تصویری ابزار شبیه سازی و بررسی پروتکل امنیتی اسکایتر net work ۰ ۲,۶۳۷ ۲۲ فروردین ۱۳۹۸ ۰۳:۲۵ ب.ظ
آخرین ارسال: net work
  برگ برگ سازی Sanazzz ۱ ۲,۱۸۱ ۱۳ فروردین ۱۳۹۸ ۰۸:۱۸ ب.ظ
آخرین ارسال: Sanazzz
Question Pointer C++ آرایه کمک فوری ... porseshgar ۰ ۱,۶۹۴ ۰۳ اسفند ۱۳۹۷ ۰۲:۵۹ ب.ظ
آخرین ارسال: porseshgar
  راهنمایی برای انتخاب موضوع قابل پیاده سازی در زمینه بیگ دیتا برای پایان نامه one hacker alone ۱ ۳,۳۱۸ ۱۸ بهمن ۱۳۹۷ ۰۶:۳۶ ب.ظ
آخرین ارسال: Happiness.72

پرش به انجمن:

Can I see some ID?

به خاطر سپاری رمز Cancel

Feeling left out?


نگران نباش، فقط روی این لینک برای ثبت نام کلیک کن. رمزت رو فراموش کردی؟ اینجا به یادت میاریم! close

رمزت رو فراموش کردی؟

Feeling left out?


نگران نباش، فقط روی این لینک برای ثبت نام کلیک کن. close