PDA

View Full Version : جستجو دودویی در C#



best99
یک شنبه 17 آبان 1388, 10:21 صبح
با سلام
یک مثال در مورد جستجو دودویی در سی شارپ می خواستم

nasser_ray
یک شنبه 17 آبان 1388, 13:36 عصر
سلام
شما یه مثال واسه روش کار می خواهید یا خود تابع را؟


int BinSearch(int[] A, int key)
{
int low = 0, height = A.Length, Mid;
while (low <= height)
{
Mid = (low + height) / 2;
if (key == A[Mid])
return Mid;
else if (key < A[Mid])
height = Mid - 1;
else if (key > A[Mid])
low = Mid + 1;
}
return -1;
}

مثال:


int[] i = new int[] { 1, 3, 5, 8, 9, 10, 15, 20 };
BinSearch(i, 0); // return -1
BinSearch(i, 3); // return 1


فراموش نکنید در جستجوی دودویی عناصر آرایه شما باید مرتب شده باشد

best99
دوشنبه 18 آبان 1388, 12:08 عصر
سلام
شما یه مثال واسه روش کار می خواهید یا خود تابع را؟


int BinSearch(int[] A, int key)
{
int low = 0, height = A.Length, Mid;
while (low <= height)
{
Mid = (low + height) / 2;
if (key == A[Mid])
return Mid;
else if (key < A[Mid])
height = Mid - 1;
else if (key == A[Mid])
low = Mid + 1;
}
return -1;
}

مثال:


int[] i = new int[] { 1, 3, 5, 8, 9, 10, 15, 20 };
BinSearch(i, 0); // return -1
BinSearch(i, 3); // return 1


فراموش نکنید در جستجوی دودویی عناصر آرایه شما باید مرتب شده باشد

ضمن تشکر از شما
من منظورم در واقع برنامه مر بوط به این کار در سی شارپ
یعنی یک ورودی که ارایه به تعدا دهر چند تا بگیره سپس به ازای مقداری که ما میدهیم شروع به جستجو کرده و درصورت وجود پیغام وجود و یا عدم وجود دهد یعنی یک فرمی که ورودی ارایه توسط یک listboxداده شود و سپس جستجو بر اساس مقداری که در text box تعیین شده انجام شود

nasser_ray
دوشنبه 18 آبان 1388, 13:42 عصر
سلام
این کد کاملا در C#‎ کار می کنه.
شما نگفته بودید که در چه نوع آرایه ای می خواهید جستجو رو انجام بدید.
من برای جستجو در یک لیست باکس در این مثال تعریف تابع بالا رو بجای int بصورت string در نظر گرفتم و جستجو بین عناصر رشته ای آرایه صورت می پذیره. (فرض کردم عناصر لیست باکس مقادیر رشته ای هستند)


int BinSearch(string[] A, string key)
{
int low = 0, height = A.Length, Mid;
while (low <= height)
{
Mid = (low + height) / 2;
if (key == A[Mid])
return Mid;
else if (key.CompareTo(A[Mid]) < 0)
height = Mid - 1;
else if (key.CompareTo(A[Mid]) > 0)
low = Mid + 1;
}
return -1;
}
و در مثلا رویداد کلیک یک کلید این کد رو می نویسم (فرض بر این است که یک listbox بنام listBox11 قبلا روی فرم ایجاد و مقدار دهی شده است)


private void button1_Click(object sender, EventArgs e)
{
string[] itms = new string[listBox1.Items.Count]; // Make a Array
listBox1.Items.CopyTo(itms,0); // Copy List Box Items to a String Array
Array.Sort(itms); // Sortet List Box Items
if (BinSearch(itms, textBox1.Text) == -1)
MessageBox.Show("Not Found");
else
MessageBox.Show("Found");
}

best99
سه شنبه 19 آبان 1388, 10:26 صبح
با سلام و تشکر از کاربر گرامی nasser_ray
با توجه به راهنمایی شما دوست عزیز برنامه جستجو دودویی نوشته شده ام را در فایل ضمیمه زیر قرار دادم فایل حاوی یک عکس که مربوط به خطای منطقی که در حین برنامه و زمان جستجو رخ میده زمانی که عدد خیلی بزرگی وارد می کنم این پیغام ظاهر میشه لطف کنید اگر مقدور علت این خطا و همچنین اگر پیشنهادی برای بهتر شدن برنامه دارید ارائه کنید ممنون میشم
با تشکر

nasser_ray
سه شنبه 19 آبان 1388, 20:13 عصر
سلام
با عرض پوزش من در تابع اول یک اشتباه تایپی داشتم (چون اون موقع دسترسی به کامپایلر نداشتم متوجش نشدم) :خجالت::ناراحت:
در else دوم بجای == باید از < استفاده می شد.
مشکل برنامه شما هم با تعویض خط اول تابع حل می شه


int low = 0, height = A.Length, Mid;
به
int low = 0, height = A.Length - 1, Mid;

-- کد تابع رو درست کردم

پوزش مججد :اشتباه: