PDA

View Full Version : الگوریتم پیدا کردن کوچکترین اعداد



hojjat_gh
دوشنبه 28 مرداد 1387, 17:21 عصر
با سلام
دوستان من میخوام در بین n عدد کوچکترین پنج عدد رو پیدا کنم ساده ترین الگوریتم به نظر شما چی میتونه باشه؟(نکته:کوچکترین پنج عدد)

اَرژنگ
دوشنبه 28 مرداد 1387, 17:37 عصر
با سلام
دوستان من میخوام در بین n عدد کوچکترین پنج عدد رو پیدا کنم ساده ترین الگوریتم به نظر شما چی میتونه باشه؟(نکته:کوچکترین پنج عدد)

۱.نگفتید این n عددسورت شدند یا نه؟
۲.ساده‌ترین الگریتم معنی ندارد، سادگی را به چی حساب میکنید؟ چند خط کد؟ چند نوع عملیات مختلف؟ چند بار اجرا شدن چند خط کد از یکبار اجرا شدن تمام خطهایه کد با هم ساده‌تر حساب میشه؟ الگریتمی که کمترین استفاده از حافظه ر ا میکند و بیشترین مقدار عملیات انجام میده از الگریتمی که بیشترین مقدار حافظه را میگیرد و کمترین مقدار عملیات انجام میده ساده تر است ؟ یا بر عکس؟ الگریتمی که یکمقداری از حافظه و یکمقداری از عملیات سنگین است ولی ۸۰ درصد بچه دبستانی ازش در ذهنشان استفاده میکند از الگریتمی که ۹۰ درصد دانشگاه‌هیها در ذهنشان استفاده میکنند ساده تر است یا نیست ؟ چرا و به چه دلیل؟

(نکته، با اینکه این سوال به نظر میاد که تکلیف مدرسه‌ای باشد، اولین کاری که باید انجام بشه دقیق مطرح کردن سوال است، اگر سوال دقیق مطرح نشده باشد که واقعا جواب باید چه خصوصیات و شرائطی را ارضا کند ، دنبال جواب درست گشتن براش وقت هدر دادن است).

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

برایه سوالات مبهم جوابهای درست زیادی هستند که با هم، هم متغایرت و هم تضاد میتوانند داشته باشند. تا جایی که میبینم باید رویه این سوال کلی زمان وقت صرف بشد تا تازه قابل پرسیدن بشه، چه بشه که بهش بخواهیم جواب هم بدیم.

mehdad.koulab
دوشنبه 28 مرداد 1387, 20:03 عصر
سلام
اگه اعداد sort هستند كه كاري نداره اگه sort نيستند
1)با يكي از الگوريتمها sortاش كني بعد هم اعداد رو پيدا كني
2)اعداد رو يكي يكي با هم مقايسه كني
ولي اگه از روش اول استفاده كني بهتره

hojjat_gh
دوشنبه 28 مرداد 1387, 20:54 عصر
نگفتید این n عددسورت شدند یا نه؟
نه اعداد در هم اند

ساده‌ترین الگریتم معنی ندارد، سادگی را به چی حساب میکنید؟ چند خط کد؟ چند نوع عملیات مختلف؟
سادگی رو تعداد حداقل خط کد بابیشترین کارایی تعبیر میکنم

چند بار اجرا شدن چند خط کد از یکبار اجرا شدن تمام خطهایه کد با هم ساده‌تر حساب میشه؟
بستگی به شرایط و منطق برنامه داره

الگریتمی که کمترین استفاده از حافظه ر ا میکند و بیشترین مقدار عملیات انجام میده از الگریتمی که بیشترین مقدار حافظه را میگیرد و کمترین مقدار عملیات انجام میده ساده تر است ؟ یا بر عکس؟
تلفیق هر دو حالت
الگوریتمی که کمترین حافظه رو اشغال کند و کمترین عملیات رو انجام بدهد


الگریتمی که یکمقداری از حافظه و یکمقداری از عملیات سنگین است ولی ۸۰ درصد بچه دبستانی ازش در ذهنشان استفاده میکند از الگریتمی که ۹۰ درصد دانشگاه‌هیها در ذهنشان استفاده میکنند ساده تر است یا نیست ؟ چرا و به چه دلیل؟
الگوریتمی که همه درکش کنند و در اوج سادگی بالاترین کارایی رو داشته باشه
نمونش الگوریتم مجموع تصاعد حسابیه که گاوس زمانی که سوم دبستان بود ارایه داد و گفت که اگه اعداد 1 تا 100 رو کنار هم بذاری وزیر اون از 100 تا 1 رو بذاری مجموع هر عدد با عدد زیریش میشه 101 و بعد با توجه به اینکه 100 تا از این 101 ها داریم میشه مجموع رو بدست اورد که این رو بچه دبستانیها درک میکنند ودانشگاهیها دارند ازش استفاده میکنند!!


(نکته، با اینکه این سوال به نظر میاد که تکلیف مدرسه‌ای باشد، اولین کاری که باید انجام بشه دقیق مطرح کردن سوال است، اگر سوال دقیق مطرح نشده باشد که واقعا جواب باید چه خصوصیات و شرائطی را ارضا کند ، دنبال جواب درست گشتن براش وقت هدر دادن است).

شاید به نظر شما مدرسه ایه ولی برا من خیلی مهمه
من قبول دارم که سوال رو کلی مطرح کردم ولی فکر نمیکنم که شما کلا سوال رو متوجه نشده باشید!!
ضمن تشکر از شما واینکه شما وقت گذاشتید و این نکات وسوالات(که فکر کنم بیش از ارایه دادن یک جواب ویک الگوریتم زمان برده) رو مطرح کردید سوال دقیق من اینه که کاربر n رو( بین 6تا 100 )وارد میکنه و بعد از گرفتن n عدد توسط برنامه الگوریتم باید پنج عدد کوچک که از بقیه کوچکترند رو برگردونه
وبرای اینکار شاید الگوریتم دودویی یا حبابی جواب بدن ولی نمیدونم چطوری ازشون استفاده کنم و ایا اینکه الگوریتم ارایه شده بهتری وجود داره؟وچطور میشه از این الگوریتمها استفاده کرد؟

dadvand
دوشنبه 28 مرداد 1387, 23:47 عصر
سلام
اگه اعداد sort هستند كه كاري نداره اگه sort نيستند
1)با يكي از الگوريتمها sortاش كني بعد هم اعداد رو پيدا كني
2)اعداد رو يكي يكي با هم مقايسه كني
ولي اگه از روش اول استفاده كني بهتره


چیزی رو که با پیچیدگی (O(N حل میشه رو میخوای با nlogn یا n^2 حلش کنید ؟

راه حل پیشنهادی من :
یک آرایه 5 عنصری یا 5 تا متغیر تعریف میکنید . 5 عدد اول رو بصورت مرتب در این آرایه قرار میدین . بعد از عدد ششم به بعد ببینید عدد جدید ، کوچکتر از بزرگترین عدد یعنی (5)a در آرایه 5 تایی هست ؟
اگه کوچکتر بود (5) a رو حذف ، و تا پیدا شدن مکان درست عدد جدید در آرایه 5 تایی ، اعداد رو به جلو شیفت میدین (یعنی دوباره ارایه را با مقدار جدید مرتب کنید) .پیچیدگی حداکثر n*5*log 5 است یعنی همان ( O(N
اگر دوستان کسی راه حل دیگری سراغ داره یا اشکالی در این راه حل میبینه ممنون میشم .


موفق باشید

dadvand
سه شنبه 29 مرداد 1387, 00:27 صبح
سادگی رو تعداد حداقل خط کد بابیشترین کارایی تعبیر میکنم

تلفیق هر دو حالت
الگوریتمی که کمترین حافظه رو اشغال کند و کمترین عملیات رو انجام بدهد


الگوریتمی که همه درکش کنند و در اوج سادگی بالاترین کارایی رو داشته باشه


وبرای اینکار شاید الگوریتم دودویی یا حبابی جواب بدن ولی نمیدونم چطوری ازشون استفاده کنم

در ضمن توضیحات جناب آرژنگ کاملا درست است و باید توجه داشته باشین .
ایشون یک راهنمایی کلی کردن که همیشه بدردتون خواهد خورد و بجای توجیه اشتباهتان که بعضی شون هم کاملا غلط است باید از ایشون تشکر کنید .

معیار شما از تلفیق کمترین حافظه و کمترین عملیات چیست ؟ هر کدام چند درصد ؟ در خیلی برنامه ها حافظه برای ما اصلا مهم نیست و حاضر به هزینه هر مقدار آن هستیم ....

الگوریتم دودویی مربوط به جستجو انهم در لیست مرتب است ولی حبابی مربوط به مرتب سازی است و این دو کاملا باهم فرق دارند .

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

معمولا الگوریتمهایی که کارایی بالایی دارند پیچیده ترند و درکش مشکل تر است مثلا مرتب سازی سریع یا merg sort یا heap کمی پیچده و درک آنها کمی مشکل تر از مثلا جستجوی انتخابی است ولی کاریی این دو خیلی با هم متفاوت است .

موفق باشی

اَرژنگ
سه شنبه 29 مرداد 1387, 14:50 عصر
شاید به نظر شما مدرسه ایه ولی برا من خیلی مهمه
من قبول دارم که سوال رو کلی مطرح کردم ولی فکر نمیکنم که شما کلا سوال رو متوجه نشده باشید!!
ضمن تشکر از شما واینکه شما وقت گذاشتید و این نکات وسوالات(که فکر کنم بیش از ارایه دادن یک جواب ویک الگوریتم زمان برده) رو مطرح کردید سوال دقیق من اینه که کاربر n رو( بین 6تا 100 )وارد میکنه و بعد از گرفتن n عدد توسط برنامه الگوریتم باید پنج عدد کوچک که از بقیه کوچکترند رو برگردونه
وبرای اینکار شاید الگوریتم دودویی یا حبابی جواب بدن ولی نمیدونم چطوری ازشون استفاده کنم و ایا اینکه الگوریتم ارایه شده بهتری وجود داره؟وچطور میشه از این الگوریتمها استفاده کرد؟
منظورم این نبود که سطحش پائینه و مدرسه‌ای، ممکن بود مال دانشگاه هم باشد ولی به نظر مانند یک تکلیفی آمد که در کلاس داده باشند (تکلیف، مشق ، تز دانشگاه ، همشان برایه من یکی هستند).

اگر یک الگریتم داشته باشید که کوچکترین عدد را برگرداند، مشکلتان حل است.

یا اینکه بر طبق چیزی که گفتید همینطوری که داده‌ها وارد میشند هر بار با ۵ تا از کوچکترین اعدادی که وارد شده مقایسه کنید و اگر از یکیشان کوچکتر بود، نگهشان دارید.

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

موفق باشید

یک هینت، اگر این مسعله را به یک مسعله دیگری که میدانید حل کنید تبدیل کنید، مسعله را حل شده حساب کنید.

اَرژنگ
سه شنبه 29 مرداد 1387, 15:53 عصر
الگوریتمی که همه درکش کنند و در اوج سادگی بالاترین کارایی رو داشته باشه
نمونش الگوریتم مجموع تصاعد حسابیه که گاوس زمانی که سوم دبستان بود ارایه داد و گفت که اگه اعداد 1 تا 100 رو کنار هم بذاری وزیر اون از 100 تا 1 رو بذاری مجموع هر عدد با عدد زیریش میشه 101 و بعد با توجه به اینکه 100 تا از این 101 ها داریم میشه مجموع رو بدست اورد که این رو بچه دبستانیها درک میکنند ودانشگاهیها دارند ازش استفاده میکنند!!

این مثال ، مثال خوبی نیست.
۱.انعطاف پزیری ندارد، برایه اینکه انعطاف پزیرین نداشتن این الگریتم را ببینید به جایه جمع کردن تمام اعداد فقط اعداد فرد یا زوج یا هر ۳ تا عدد یکبار یا هر چند تا اعداد یکبار را از یک تا ۱۰۰ را بخواد استفاده بشد به کار نمیاد.

یا توانهایه اعداد از ۱ تا ۱۰۰، به عنوان مثال ۱+۴+۹+۱۶+...+۱۰۰۰۰
همانطوری که معلوم است این الگریتم فقط بدرد حالتهایه خاصی میخورد، در حالی که با استفاده از یک لوپ میشه خیلی انعطاف پزیری بدست آورد.

ولی هیچ کدام از الگریتمها را نمیشه از اون یکی ساده‌تر شناخت.

BIGBAD
دوشنبه 18 آذر 1392, 14:28 عصر
خیلی جالب بود مرسی