PDA

View Full Version : سوال: چطور شروع کنم؟ یا اینکه اسمه این برنامه چیه؟



ali_orz
دوشنبه 03 بهمن 1390, 20:06 عصر
سلام،
من می خوام یک برنامه بنویسم می خواستم بدونم چطور شروع کنم یا ایده کلی چیه و اینکه یا اسم مستعاری اگر این برنامه دارد، لطف کنید نام ببرید؟

آرایه ای غیر مرتب از اعداد صحیح داریم و می خواهیم نخستین عنصر )از ابتدای آرایه( که مقدار آن
عنصر ، دقیقا 3 مرتبه در این آرایه تکرار شده است را پیدا کنیم. مثلا در آرایه زیر، مقدار عنصر مورد
نظر برابر 2 است.
Number : {1,2,2,6,4,7,1,6,5,6,8,9,2}

با کمترین مرتبه زمانی و حافظه ممکن!

spiderman200700
سه شنبه 04 بهمن 1390, 00:27 صبح
سلام.
این برنامه،دوتا حلقه میخواد.
باید هر عنصر آرایه،با تمام عناصر مقایسه بشه.
یه شمارنده میخواد که موقع مقایسه ی هر عنصر تعداد تکرار اونو بشماره.
به محض پیدا شدن عنصری که سه بار تکرار شده،باید از هر دو حقه خارج بشی.

ali_orz
سه شنبه 04 بهمن 1390, 01:29 صبح
ممنون دوست عزیز.
من این برنامه رو نوشتم اما با لیست پیوندی (هر دفعه که می خواد به لیست اضافه کنه میاد نگاه می کنه آیا تو لیست وجود داره این عدد یا نه! اگه وجود نداشته باشه که عدد رو تو number اون نود میریزه و faravany اون نود رو هم 1 می کنه ولی اگر اون عدد وجود داشت میاد اول چک میکنه اگه با اضافه کردن عدد faravany اون نود میشه 3 که خارج میشه و number نود رو چاپ می کنه ولی در غیر این صورت یکی به faravany نود عدد اضافه میکنه و میره برای عدد بعد ) به نظر جنابعالی کدوم بهینه تره (با کمترین مرتبه زمانی و حافظه ممکن!) آرایه ای بهتره یا لیست پیوندی . بازم ممنون.
public class Node(){
int number;
int faravany;
Node next;
}

مهرداد سیف زاده
سه شنبه 04 بهمن 1390, 10:52 صبح
چرا داری برنامه رو میپیچونی خودش گفته با کمترین مرتبه زمانی پس روشی رو پیش بگیر که خواستی مرتبه زمانی رو کم کنی راه فرار داشته باشه
اگر دو تا حلقه باشه هر با که یک گام به جلو میری باید گامهای حلقه قبل چندین بار تکرار بشه که امکان پیچیدگی زیاد میشه ولی روش پایه برای ادمه کار هست
یک الگوریتم بهینه برای جستجو داریم بنام درخت جستجوی دودویی بهینه که عمل مقایسه رو با ذخیره موارد مقایسه در آرایه کم کرده البته این رو گفتم تا به ادامه مسئله که پیچیدگی زمانی رو مطرح کرده در نظر داشته باشی برای اطلاعات بیشتر باید به کتابهای طراحی الگوریتم مراجعه کنی اگر هم دسترسی نداری پیام بده این الگوریتم رو قرار بدم.

ali_orz
سه شنبه 04 بهمن 1390, 12:17 عصر
اگر الگوریتم رو بزاری ممنون میشم.
چرا داری برنامه رو میپیچونی خودش گفته با کمترین مرتبه زمانی پس روشی رو پیش بگیر که خواستی مرتبه زمانی رو کم کنی راه فرار داشته باشه
اگر دو تا حلقه باشه هر با که یک گام به جلو میری باید گامهای حلقه قبل چندین بار تکرار بشه که امکان پیچیدگی زیاد میشه ولی روش پایه برای ادمه کار هست
یک الگوریتم بهینه برای جستجو داریم بنام درخت جستجوی دودویی بهینه که عمل مقایسه رو با ذخیره موارد مقایسه در آرایه کم کرده البته این رو گفتم تا به ادامه مسئله که پیچیدگی زمانی رو مطرح کرده در نظر داشته باشی برای اطلاعات بیشتر باید به کتابهای طراحی الگوریتم مراجعه کنی اگر هم دسترسی نداری پیام بده این الگوریتم رو قرار بدم.

maktoom
سه شنبه 04 بهمن 1390, 22:41 عصر
سلام
این برنامه نوع خاصی از تعیین مد در یک رشته از اعداده. یعنی همون کاری که در برنامه یافتن مد برای بیشترین تکرار انجام می دیم اینجا باید با یه تکرار خاص مقایسه بشه.
کمترین نوع جستجو رو هم می تونید با گشتی توی ویکیپدیا پیدا کنید.
موفق باشید.

مهرداد سیف زاده
چهارشنبه 05 بهمن 1390, 18:09 عصر
روش من استفاده از جستجویی دودویی درختی هست در این روش بعد از پیاده سازی در زمان جستجو با الگوریتم جستجویی دودویی بهینه می تونی کاهش زمانی و پیچیدگی رو ایجاد کنی
اسم برنامه که تو وب بخوای پیدا کنی Optimal binary search trees هست الگوریتمش هم تو ویکی پدیا هست هم با تایپ همین عبارت تو گوگل لینکای زیادی پیدا می کنی
البته یه مقاله هم درباره جستجوی دودویی بهینه توسط برنامه نویسی شی گرا هم هست

http://www.cs.arizona.edu/~mccann/research/optBSTmeetsOOP.pdf

اینم الگوریتمش
procedure Optimum Search Tree(f, f´, c):
for j = 0 to n do
c[j, j] = 0, F[j, j] = f´j
for d = 1 to n do
for i = 0 to (n − d) do
j = i + d
F[i, j] = F[i, j − 1] + f´ + f´j
c[i, j] = MIN(i<k<=j){c[i, k − 1] + c[k, j]} + F[i, j]