آیا استفاده از std::find برای وکتور مرتب شده مناسب است ؟ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

آیا استفاده از std::find برای وکتور مرتب شده مناسب است ؟

+2 امتیاز
اگر یک وکتور مرتب شده داشته باشیم  و از std::find استفاده کنیم  آیا find الگوریتم جدایی برای وکتوری که مرتب شده داشته باشه داره ؟ (مثلا binary search ) یا بصورت خطی جست و جو می کنه ؟

برای وکتور مرتب شده بهتر نیست که از std::binary_search استفاده بشه ؟
سوال شده مرداد 26, 1393  بوسیله ی sailent (امتیاز 355)   16 44 59

1 پاسخ

+2 امتیاز
 
بهترین پاسخ
اگر vector سورت شدست std::binary_search برای تعداد بالا (مثلا بیشتر از 20 تا ) به مراتب سرعت بالاتری داره چون بر خلاف find که از مرتبه n هست از  مرتبه logn هست . البته find  از نظر caching مناسب تره (چون بصورت ترتیببی به عناصر دسترسی پیدا می کنیم بر خلاف binary_search که هر بار عنصر وسط بازه مقایسه میشه ) 
در سی پلاس پلاس binary_search  از نظر عملکرد با find فرق داره مقدار بازگشتی binarry_search درست یا غلط هست در حالی که find محل عنصر پیدا شده رو بر می گردونه .  برای عملکرد مشابه میشه از equal_Range استفاده کرد.

برای پیاده سازی find داخل ویژوال استودیو از 2 تابع استفاده شده :

template<class _InIt,
class _Ty> inline
	_InIt _Find(_InIt _First, _InIt _Last, const _Ty& _Val, false_type)
{	// find first matching _Val
		for (; _First != _Last; ++_First)
			if (*_First == _Val)
				break;
		return (_First);
}

همون طوری که مشخصه کاملا بصورت خطی جست و جو انجام میشه .(از عنصر اول تا آخر یکی یکی مقایسه میشه )

یکی هم مربوط به char و bool 

template<class _InIt,
class _Ty> inline
	_InIt _Find(_InIt _First, _InIt _Last, const _Ty& _Val, true_type)
{	// find first byte matching integral _Val
		if (!_Within_limits(_First, _Val))
			return (_Last);
		_First = static_cast<_InIt>(_CSTD memchr(
			_First, static_cast<unsigned char>(_Val), _Last - _First));
		return (_First ? _First : _Last);
}

برای char  و bool  به جای مقایسه جدا جدای تک تک char ها از تابع memchr برای مقایسه کل رنج حافظه نظر بصورت یکجا استفاده میشه که باز هم خطی هست

پاسخ داده شده مرداد 27, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد شهریور 2, 1393 بوسیله ی sailent
...