PDA

View Full Version : مبتدی: جستجوی باینری در آرایه دو بعدی



Collector
یک شنبه 28 آبان 1391, 14:40 عصر
سلام
با این کد میتوان یک عدد را در یک آرایه یک بعدی به وسیله جستجویی باینری جستجو کرد
من میخوام یک آرایه دو بعدی را جستجو کنم .لطفا راهنمایی کنید
خواستم یک While تو در تو استفاده کنم نمیدونستم چه ضرطی باید بگذارم.


void Binary_Search(int *Arr)
{
cout<<endl<<"Binary Search Matrix : "<<endl;
cout<<endl<<"Enter Search Key: ";
int key;
cin>>key;
int mid, low, high, flag;
flag = 0;
low = 0;
high = Num-1;
while(high >= low && !flag)
{
mid = (high + low) / 2;
if (key == Arr[mid])
flag = mid;
else if (key < Arr[mid])
high = mid - 1;
else
low = mid + 1;
}
if (flag)
cout << "Founded.\n";
else
cout << "Not Founded.\n";
return;
}

vistacali
یک شنبه 28 آبان 1391, 16:25 عصر
چون باید در این جستجو به عنصر ارایه دسترسی داشته باشی اگر اشتباه نکنم باید از اشاره گرها استفاده کنی

مسعود اقدسی فام
یک شنبه 28 آبان 1391, 16:41 عصر
ماتریستون با چه معیاری مرتبه؟ سطری مرتبه یا ستونی یا یه روش دیگه؟

Collector
یک شنبه 28 آبان 1391, 17:58 عصر
از روش مرتب سازی حبابی استفاده کردم.
امکانش هست کد جستجویی باینری را تبدیل به دو بعدی کنید.

maktoom
یک شنبه 28 آبان 1391, 18:18 عصر
سلام
شما می تویند فرض کنید دارید دو تا آرایه هم اندازه رو جستجو می کنید. منتها دوبار می خواید اینکارو بکنید.

مسعود اقدسی فام
یک شنبه 28 آبان 1391, 18:45 عصر
از روش مرتب سازی حبابی استفاده کردم.
امکانش هست کد جستجویی باینری را تبدیل به دو بعدی کنید.

اگه با اشاره‌گرها آشنا باشید می‌دونید که در ++C هر آرایه در واقع با یه اشاره‌گر به ابتدای اون معرفی می‌شه. در مورد آرایه‌های دو بعدی سطرها پشت سر هم و به صورت خطی در انتهای هر سطر بالاتر به هم متصل هستن. یعنی اگه ماتریس ده در ده باشه، یا اشاره‌گر به ابتدای آرایه دارید که صد تا خونه بعد (با خود محل اشاره) خودش عناصر آرایه هستن. ده تای اول سطر اول، ده تای دوم سطر دوم و الی آخر. پس راحت با استفاده از امکانات اشاره‌گر می‌تونی تصور کنی که یه آرایه خطی صد تایی داری و جستحو کنی. اگه ماتریس به صورت ستونی مرتب شده باشه اول یه ترانهاده بکن تا جای سطر و ستون عوض شه و به صورت سطری مرتب باشه.

H_G_G_I
یک شنبه 28 آبان 1391, 22:55 عصر
من اینو نوشتم فکر کنم بدردتون بخوره !

#include <iostream>

void binSerach(int* _array2x2, int _size1, int size2, int _goal)
{
int n = 0;
for(int i = 0; i < _size1; i++)
{
for(int j = 0; j < size2; j++, n++)
{
if(_array2x2[n] == _goal)
{
std::cout << i << "\t"<< j;
return;
}
}
}
}

int main(int argc, char* argv[])
{
int numba[3][2]= { {1,2}, {3,4}, {5,6} };
binSerach(numba[0], 3, 2, 5 );
system("PAUSE");
}

:لبخندساده:

مسعود اقدسی فام
یک شنبه 28 آبان 1391, 23:14 عصر
من اینو نوشتم فکر کنم بدردتون بخوره !

#include <iostream>

void binSerach(int* _array2x2, int _size1, int size2, int _goal)
{
int n = 0;
for(int i = 0; i < _size1; i++)
{
for(int j = 0; j < size2; j++, n++)
{
if(_array2x2[n] == _goal)
{
std::cout << i << "\t"<< j;
return;
}
}
}
}

int main(int argc, char* argv[])
{
int numba[3][2]= { {1,2}, {3,4}, {5,6} };
binSerach(numba[0], 3, 4, 5 );
system("PAUSE");
}

:لبخندساده:

این کجاش دودوئیه؟ به صورت خطی همه رو می‌گرده دیگه. نه؟

H_G_G_I
دوشنبه 29 آبان 1391, 14:22 عصر
مگه منظور از رایه دو بعدی

int a[][];

نیست ؟
خب این ارایه هم در واقع همون یه بعدیه ! ارایه ها همه پشت سر هم هستن دیگه !

int a[3][4] === int a[3*4];

برای اینکه بخاهیم بفرستیم به تابع دو در دو نمی شه ! عنصر اولش که همون شروع ارایه هست رو می فرستیم !
الان این که من نوشتم کار می کنه دیگه !
می گه که عدد مورد نظر کجاست ! عنصر اول و دومش چنده می گه .

Collector
دوشنبه 29 آبان 1391, 16:14 عصر
مگه منظور از رایه دو بعدی

int a[][];

نیست ؟
خب این ارایه هم در واقع همون یه بعدیه ! ارایه ها همه پشت سر هم هستن دیگه !

int a[3][4] === int a[3*4];

برای اینکه بخاهیم بفرستیم به تابع دو در دو نمی شه ! عنصر اولش که همون شروع ارایه هست رو می فرستیم !
الان این که من نوشتم کار می کنه دیگه !
می گه که عدد مورد نظر کجاست ! عنصر اول و دومش چنده می گه .

اگر پست اول را نگاه کنید متوجه میشوید که در آن کد در یک آرایه به روش باینری میتوان یک عدد را جستجو کرد
حالا من میخوام کاری کنم که بتواند در یک آرایه دو بعدی هم بتوان با این روش یک عدد را جستجو کرد

مسعود اقدسی فام
دوشنبه 29 آبان 1391, 16:14 عصر
مگه منظور از رایه دو بعدی

int a[][];

نیست ؟
خب این ارایه هم در واقع همون یه بعدیه ! ارایه ها همه پشت سر هم هستن دیگه !

int a[3][4] === int a[3*4];

برای اینکه بخاهیم بفرستیم به تابع دو در دو نمی شه ! عنصر اولش که همون شروع ارایه هست رو می فرستیم !
الان این که من نوشتم کار می کنه دیگه !
می گه که عدد مورد نظر کجاست ! عنصر اول و دومش چنده می گه .

نگغتم اشتباه کار می‌کنه. تست نکردم. می‌گم کجاش جستجوی دودویی هستش؟ جستجوی دودویی رو که بلدید؟ کجای این کد پیاده‌سازی شده؟

مسعود اقدسی فام
دوشنبه 29 آبان 1391, 17:15 عصر
من راهش رو بهتون گفتم. به جای [p[i عبارت (p + i)* رو استفاده کنید و به جای n که تعداد عناصر آرایه بودن تعداد عناصر ماتریس رو که معمولا n * n هستش بنویسید.

اگه اجرا نشد کد رو دوباره بذارید تا ببینیم مشکل چیه.

Collector
دوشنبه 29 آبان 1391, 18:05 عصر
من راهش رو بهتون گفتم. به جای [p[i عبارت (p + i)* رو استفاده کنید و به جای n که تعداد عناصر آرایه بودن تعداد عناصر ماتریس رو که معمولا n * n هستش بنویسید.

اگه اجرا نشد کد رو دوباره بذارید تا ببینیم مشکل چیه.

کد کار نمیکنه!
با ویژوال ++Visual C کامپایل میکنم
void Binary_Search(int **Arr)
{
cout<<endl<<"Binary Search Matrix : "<<endl;
cout<<endl<<"Enter Search Key: ";
int key;
cin>>key;

int mid, low, high, flag;
flag = 0;
low = 0;
high = 16-1;

while(high >= low && !flag)
{
mid = (high + low) / 2;

if (key == **(Arr + i))
flag = mid;
else if (key < **(Arr + i))
high = mid - 1;
else
low = mid + 1;
}

if (flag)
cout << "Founded.\n";
else
cout << "Not Founded.\n";

return;
}

مسعود اقدسی فام
دوشنبه 29 آبان 1391, 18:52 عصر
اگه من نوشتم i شما هم حتما باید i بنویسید یدون اینکه تعریفش کنید؟ i همون mid بود دیگه!





void Binary_Search(int **Arr)
{
cout<<endl<<"Binary Search Matrix : "<<endl;
cout<<endl<<"Enter Search Key: ";
int key;
cin>>key;

int mid, low, high, flag;
flag = 0;
low = 0;
high = 16-1;

while(high >= low && !flag)
{
mid = (high + low) / 2;

if (key == *(*(Arr) + mid))
flag = mid;
else if (key < *(*(Arr) + mid))
high = mid - 1;
else
low = mid + 1;
}

if (flag)
cout << "Founded.\n";
else
cout << "Not Founded.\n";

return;
}




تست کنید.

dalshin
دوشنبه 06 آذر 1391, 19:19 عصر
من دقیقا دارم رو همین برنامه کار میکنم اما مشکل من اساسی تره چون توی مرحله سورت کردن وقتی داده های ماتریس رو سورت می کنم تنها سطر به سطر این عمل انجام میشه و کدم روی کل ماتریس عمل نمی کنه

مثلا یه ماتریس 3*3

1 7 9
3 4 2
6 9 1

وقتی مرتب شده رو از برنامه میگیرم به این صورته

9 7 1
4 3 2
9 6 1

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

dalshin
دوشنبه 06 آذر 1391, 19:21 عصر
کد برنامه من به صورته زیره برنامه یه ماتریس تصادفی تولید میکنه و با ارجاع به تابع قراره مرتب و جستوجوی دو دویی روش انجام بشه. حالا این کد رو ببینید

int hold;
cout<<"\nMatrix A :"<<endl;
for (int i=0 ; i<n ; i++){ // peymayesh
for(int j=0 ; j<n ; j++){
cout<<setw(3)<<A[i][j];} // Print Matrix : )
cout<<endl;
}
cout<<"Ascending order of Matrix A"<<endl;
for (int pass = 0 ; pass < n ; pass++){
for (int i=0 ; i<n ; i++){// peymayesh
for(int j=0 ; j<n-1 ; j++){
if (A[i][j] > A[i][j+1])
{
hold=A[i][j];
A[i][j]=A[i][j+1];
A[i][j+1]=hold;


}}}}
for (int i=0 ; i<n ; i++){//peymayesh satr
for(int j=0 ; j<n ; j++){ // peymayesh sotn
cout<<setw(3)<<A[i][j];}}// Print Matrix : )

cout<<endl;

مسعود اقدسی فام
دوشنبه 06 آذر 1391, 19:34 عصر
اگه به کل بحثی که شده و کدهایی که گذاشته شده توجه کنید می‌تونید برنامه‌ی مطلوبتون رو بنویسید.