PDA

View Full Version : مشکل در پیاده سازی جستجوی دودویی



magic69
شنبه 04 دی 1389, 15:27 عصر
سلام دوستان.کد زیر مربوط به جستجوی دودویی هستش که من پیاده سازیش کردم.در کد پایین textBox1 آرایه ای از اعداد هست که یوزر وارد میکنه و textBox2 عددی است که یوزر میخاد در آرایه پیداش کنه.
مشکلم اینجاست که وقتی breakpoint رو میزارم رو خطی که پایین مشخص کردم,عدد مشخص شده در textBox2در textBox2.text مقدارشو نشون میده ولی در searchnumsمقدارش صفر هستش.میشه راهنماییم کنید که مشکلش کجاست؟خیلی ممنون


<div align="left">

public void button1_Click(object sender, EventArgs e)
{

int searchnums = Convert.ToInt32(textBox2.Text);//مشکل همینجاست
int result = binarysearch(searchnums);
MessageBox.Show(result.ToString());
}
public int binarysearch(int searchnum)
{
string[] source = textBox1.Text.Split(',');
int[] nums = new int[source.Length];
for (int i = 0; i < source.Length; i++)
{
nums[i] = Convert.ToInt32(source[i]);
}
int first =0;
int last = nums.Length-1;

while (1<= nums.Length)
{
int mid = (int)Math.Floor(first+last / 2.0);
if (first > last)
{
break;
}
if (searchnum < nums[mid])
{
last = mid - 1;
}
if (searchnum > nums[mid])
{
first = mid + 1;
}
else
{
return nums[mid];
}
}
return -1;

}

Reza_Yarahmadi
شنبه 04 دی 1389, 15:55 عصر
فكر نميكنم مشكل از اون خط باشه!!
توجه داشته باشيد كه يك خط كد زماني انجام ميشه (در حالت Debugging) كه اجرا از اون خط گذشته باشه يعني همون highlight زرد رنگ از اون خط عبور كرده باشه.
فكر كنم مشكل از الگوريتم شما باشه ، تا جايي كه يادمه در الگوريتم باينري داده هاي آرايه بايد مرتب شده باشند در حالي كه آرايه شما هيچ نوع عمليات مرتب سازي روش انجام نشده.

quantomquery
شنبه 04 دی 1389, 18:07 عصر
سلام دوستان.کد زیر مربوط به جستجوی دودویی هستش که من پیاده سازیش کردم.در کد پایین textBox1 آرایه ای از اعداد هست که یوزر وارد میکنه و textBox2 عددی است که یوزر میخاد در آرایه پیداش کنه.
مشکلم اینجاست که وقتی breakpoint رو میزارم رو خطی که پایین مشخص کردم,عدد مشخص شده در textBox2در textBox2.text مقدارشو نشون میده ولی در searchnumsمقدارش صفر هستش.میشه راهنماییم کنید که مشکلش کجاست؟خیلی ممنون


<div align="left">

public void button1_Click(object sender, EventArgs e)
{

int searchnums = Convert.ToInt32(textBox2.Text);//مشکل همینجاست
int result = binarysearch(searchnums);
MessageBox.Show(result.ToString());
}
public int binarysearch(int searchnum)
{
string[] source = textBox1.Text.Split(',');
int[] nums = new int[source.Length];
for (int i = 0; i < source.Length; i++)
{
nums[i] = Convert.ToInt32(source[i]);
}
int first =0;
int last = nums.Length-1;

while (1<= nums.Length)
{
int mid = (int)Math.Floor(first+last / 2.0);
if (first > last)
{
break;
}
if (searchnum < nums[mid])
{
last = mid - 1;
}
if (searchnum > nums[mid])
{
first = mid + 1;
}
else
{
return nums[mid];
}
}
return -1;

}

یکی دو تا مشکل کوچیک داشت
مهمترینش مال :




int mid = (int)Math.Floor(first+last / 2.0);


که باید پرانتز ها رو بزاری و گرنه اول last رو تقسیم بر 2 می کنه بهد با first جمع می کنه
یعنی :




int mid = (int)Math.Floor((first + last) / 2.0);



بعد هم باید خونه ارایه رو برگردونی :



return mid;



و بجای else باید از if برای نتیجه استفاده کنی و گرنه else رو ربط میده به if دوم

یعنی بجای


else
{
return nums[mid];
}



بنویسیم :


if (searchnum == nums[mid])
{
return mid;
}




در کل :







public int binarysearch(int searchnum)
{
string[] source = textBox1.Text.Split(',');
int[] nums = new int[source.Length];
for (int i = 0; i < source.Length; i++)
{
nums[i] = Convert.ToInt32(source[i]);
}
int first = 0;
int last = nums.Length - 1;

while (1 <= nums.Length)
{
int mid = (int)Math.Floor((first + last) / 2.0);
if (first > last)
{
break;
}
if (searchnum < nums[mid])
{
last = mid - 1;
}
if (searchnum > nums[mid])
{
first = mid + 1;
}
if (searchnum == nums[mid])
{
return mid;
}
}
return -1;
}
private void button1_Click(object sender, EventArgs e)
{
int searchnums = Convert.ToInt32(textBox2.Text);//
int result = binarysearch(searchnums);
MessageBox.Show(result.ToString());
}



موفق باشید .....

magic69
شنبه 04 دی 1389, 21:03 عصر
یکی دو تا مشکل کوچیک داشت
مهمترینش مال :




int mid = (int)Math.Floor(first+last / 2.0);


که باید پرانتز ها رو بزاری و گرنه اول last رو تقسیم بر 2 می کنه بهد با first جمع می کنه
یعنی :




int mid = (int)Math.Floor((first + last) / 2.0);



بعد هم باید خونه ارایه رو برگردونی :



return mid;



و بجای else باید از if برای نتیجه استفاده کنی و گرنه else رو ربط میده به if دوم

یعنی بجای


else
{
return nums[mid];
}



بنویسیم :


if (searchnum == nums[mid])
{
return mid;
}




در کل :







public int binarysearch(int searchnum)
{
string[] source = textBox1.Text.Split(',');
int[] nums = new int[source.Length];
for (int i = 0; i < source.Length; i++)
{
nums[i] = Convert.ToInt32(source[i]);
}
int first = 0;
int last = nums.Length - 1;

while (1 <= nums.Length)
{
int mid = (int)Math.Floor((first + last) / 2.0);
if (first > last)
{
break;
}
if (searchnum < nums[mid])
{
last = mid - 1;
}
if (searchnum > nums[mid])
{
first = mid + 1;
}
if (searchnum == nums[mid])
{
return mid;
}
}
return -1;
}
private void button1_Click(object sender, EventArgs e)
{
int searchnums = Convert.ToInt32(textBox2.Text);//
int result = binarysearch(searchnums);
MessageBox.Show(result.ToString());
}



موفق باشید .....


آقا خیلی ممنون.درست شد.دمت گرم