موتور جستجو
موتور جستجو (پردازش)
موتور جستجو (به انگلیسی: Search Engine) یا جویشگر، در فرهنگ رایانه، به طور عمومی به برنامه‌ای گفته می‌شود که کلمات کلیدی را در یک سند یا بانک اطلاعاتی جستجو می‌کند. در اینترنت به برنامه‌ای گفته می‌شود که کلمات کلیدی موجود در فایل‌ها و سندهای وب جهانی، گروه‌های خبری، منوهای گوفر و آرشیوهای FTP را جستجو می‌کند. جویشگر های زیادی وجود دارند که امروزه از معروفترین و پراستفاده ترین آنها می‌توان به google و یاهو! جستجو اشاره کرد.





بهینه‌سازی موتور جستجو
بهینه‌سازی موتور جستجو (به انگلیسی: ‎Search engine optimization (SEO)) که گاهی در فارسی به آن سئو گفته می‌شود عملیاتی است که برای بهبود دید یک وب‌گاه یا یک صفحهٔ وب در صفحه نتایج موتورهای جستجو که می‌تواند طبیعی و یا الگوریتمی باشد، می‌گویند. این یکی از روش‌های بازاریابی موتور جستجو است. به صورت کلی وب‌گاه‌هایی که دارای بالاترین مکان و بیشترین تکرار در صفحهٔ نتایج موتورهای جستجو باشند، بازدیدکنندهٔ بیشتری از طریق موتورهای جستجو به دست می‌آورند.برای وبمسترها یکی از عوامل مهم و حیاتی بدست اوردن کاربران جدید از موتورهای جستجو و بخصوص گوگل می باشد.







تاریخچه

علم سئو در اواسط دهه ۱۹۹۰ توسط وب مستر ها و مدیران سایتهای بزرگ شروع شد. در ابتدا همه وب مسترها می بایست تمام صفحات خود را برای آمدن خزنده ها به سایت آنها ثبت می کردند تا در نهایت صفحات آنها در نتایج جستجو به نمایش گذاشته می شد. امروزه با رشد اینترنت فروش خدمات اینترنتی هم افزایش یافته است.







روش‌ها
شاخص گذاری کردن

موتورهای جستجوی پیشتاز همچون Yahoo!،Google و Bing از خزنده‌ها جهت یافتن صفحات برای نتایج جستجوی الگوریتمیک استفاده می‌کنند. صفحاتی که از داخل باقی صفحات ایندکس شده توسط موتورهای جستجو Link شده‌اند نیاز به ارسال به موتور جستجو نداشته و بصورت خودکار پیدا می‌شوند. بعضی از موتورهای جستجو ازجمله!Yahoo سرویس پولی ارسال را پیاده می‌کنند که استفاده از خزنده‌ها را هم بصورت مجموعه‌ای از قیمت‌ها و نیز بصورت سیستم بها به ازاء هر Click، اجرا می‌کند. این برنامه‌ها معمولاً قرارگیری در بانک اطلاعاتی موتور جستجو را ضمانت کرده و در قبال رتبه‌ای مشخص برای صفحه در لیست نتایج جستجو ضمانتی نمی‌کنند. دو فهرست اصلی اینترنتی یعنی Yahoo Directory و Open Directory Project، هردو نیاز به ارسال دستی و بررسی انسانی دارند.Google ابزاری به نام Google Webmaster Tools ارائه می‌دهد که در آن می‌توان نقشه سایت را توسط خوراک XML ایجاد کرده و بصورت رایگان ارسال نمود تا از یافته شدن تمام صفحات حتی صفحاتی که بصورت خودکار از طریق دنبال کردن Linkها پیدا نمی‌شوند، اطمینان حاصل نمود. خزنده‌های موتورهای جستجو می‌توانند به عوامل مختلفی در هنگام خزیدن در یک سایت توجه کنند. تمامی صفحات ایندکس نمی‌شوند. همچنین فاصله یک صفحه از ریشه سایت می‌تواند عاملی در پیدا شدن یا عدم آن توسط خزنده‌های موتورهای جستجو باشد. امروزه بسیاری از شرکتهای مطرح در دنیا به بررسی و اجرای خدمات سئو برای شرکتهای مختلف مشغول هستند.







صفحه فرود یا landing page

یکی از فاکتورهای مهم در خصوص سئو مشخص کردن صفحات فرود یا landing page است.
انتخاب کلید واژه‌های مناسب

انتخاب کلید واژه‌های مناسب یکی از فاکتورهای مهم در این رابطه‌است که بایستی توسط دارندگان وب سایت و برنامه نویسان در نظر گرفته شود.







جلوگیری از اجرای خزنده‌ها در صفحات

وبمسترها برای جلوگیری از نتایج ناخواسته در شاخص‌های جستجومی‌توانندعنکبوتهایی توسط فایل استاندارد robots.txt که در فهرست ریشه دامنه ذخیره می‌شود، بسازند که فایلها و فهرست‌های خاصی را مورد خزیدن (Crawl)قرار ندهد.







تولید محتوای جدید و کاربرپسند

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





الگوریتم جستجو
در علوم کامپیوتر و ریاضیات، یک الگوریتم جستجو، الگوریتمی است که یک مساله را به عنوان ورودی می‌گیرد و بعد از ارزیابی کردن راه حل‌های ممکن، یک راه حل برای آن مساله برمی گرداند.مجموعهٔ راه حل‌های ممکن برای یک مساله را فضای جستجو می‌نامند.بعضی از الگوریتم‌ها که با عنوان الگوریتم‌های ناآگاهانه شناخته می‌شوند الگوریتم‌هایی هستند که از متدهای ساده‌ای برای جستجوی فضای نمونه استفاده می‌کنند.در حالی که الگوریتم‌های آگاهانه با استفاده روش‌هایی مبتنی بر دانش در بارهٔ ساختار فضای جستجو، می‌کوشند تا زمان جستجو را کاهش دهند.







رده بندی

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

الگوریتم‌های ناآگاهانه
الگوریتم نخست-پهنا
الگوریتم نخست-ژرفا
الگوریتم‌های آگاهانه
الگوریتم نخست-بهترین
الگوریتم مکاشفه‌ای








جستجوی ناآگاهانه

یک الگوریتم جستجوی ناآگاهانه الگوریتمی است که به ماهیت مساله کاری ندارد.از این رو می‌توانند به طور عمومی طراحی شوند و از همان طراحی برای محدودهٔ عظیمی از مسائل استفاده کنند، این امر نیاز به طراحی انتزاعی دارد. از جمله مشکلاتی که این چنین الگوریتم‌هایی دارند این است که اغلب فضای جستجو بسیار بزرگ است و نیازمند زمان زیادی (حتی برای نمونه‌های کوچک) می‌باشد.از این رو برای بالا بردن سرعت پردازش غالبا از الگوریتم‌های آگاهانه استفاده می‌کنند.







جستجوی لیست

الگوریتم‌های جستجوی لیست شاید از ابتدایی ترین انواع الگوریتم‌های جستجو باشند.هدف آن پیدا کردن یک عنصر از مجموعه‌ای از کلید هاست(ممکن است شامل اطلاعات دیگری مرتبط با آن کلید نیز باشد). ساده ترین این الگوریتم‌ها، الگوریتم جستجوی ترتیبی است که هر عنصر از لیست را با عنصر مورد نظر مقایسه می‌کند. زمان اجرای این الگوریتم از (O(n است وقتی که n تعداد عناصر در لیست باشد. اما می‌توان از روش دیگری استفاده کرد که نیازی به جستجوی تمام لیست نباشد.جستجوی دودویی اندکی از جستجوی خطی است.زمان اجرای آن از(O(lgn است.این روش برای لیستی با تعداد دادهٔ زیاد بسیار کار آمد تر از روش الگوریتم جستجوی ترتیبی است.اما در این روش لیست باید قبل از جستجو مرتب شده باشد.{{جستجو با میان یابی برای داده‌های مرتب شده با تعداد زیاد و توزیع یکنواخت، مناسب تر از جستجوی دودویی است.زمان اجرای آن به طور متوسط ((O(lg(lgn است ولی بدترین زمان اجرای آن (O(n می‌باشد. الگوریتم graver الگوریتم پله‌ای است که برای لیست‌های مرتب نشده استفاده می‌شود. جدول درهم‌سازی نیز برای جستجوی لیست به کار می‌رود. به طور متوسط زمان اجرای ثابتی دارد.اما نیاز به فضای اضافه داشته و بدترین زمان اجرای آن از(O(n است.







جستجوی درختی

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







جستجوی گراف

بسیاری از مسائل در نظریهٔ گراف می‌تواند با الگوریتم‌ها ی پیمایش درخت حل شوند، مثل الگوریتم دیکسترا، الگوریتم کروسکال، الگوریتم نزدیک ترین همسایه و الگوریتم پریم. می‌توان این الگوریتم‌ها را توسعه یافتهٔ الگوریتم‌های جستجوی درختی دانست.







جستجوی آگاهانه

در یک جستجوی آگاهانه، از نوع خاصی از مسائل به عنوان راهنما استفاده می‌شود.یک گونهٔ خوب یک جستجوی آگاهانه با کارایی قابل توجهی نسبت به جستجوی ناآگاهانه به وجود می‌آورد. الگوریتم‌های برجستهٔ کمی از جستجوی آگاهانهٔ یک لیست وجود دارد. یکی از این الگوریتم‌ها hash table با یک تابع hash که برمبنای نوع مساله‌ای که دردست است می‌باشد.بیشتر الگوریتم‌های جستجوی آگاهانه، بسطی از درخت‌ها هستند.همانند الگوریتم‌های ناآگاهانه، این الگوریتم‌ها برای گراف‌ها نیز می‌توانند به کار روند.







جستجوی خصمانه

در یک بازی مثل شطرنج، یک درخت بازی شامل تمام حرکات ممکن توسط هر دو بازیکن و نتایج حاصل از ترکیب این حرکات وجود دارد، و ما می‌توانیم این درخت را جستجو کرده و موثرترین استراتژی برای بازی را بیابیم. این چنین مسائلی دارای مشخصهٔ منحصر به فردی هستند.برنامه‌های بازی‌های رایانه‌ای، و همچنین فرم‌های هوش مصنوعی مثل برنامه ریزی ماشین‌ها، اغلب از الگوریتم‌های جستجو مثل الگوریتم minimax (می نیمیم مجموعه‌ای از ماکزیمم‌ها)، هرس کردن درخت جستجو و هرس کردن آلفا-بتا استفاده می‌کنند.

==الگوریتم اف اسکن==

(FSCAN) F-SCAN یک الگوریتم زمان بندی دیسک است که حرکت آرم و هد دیسک در سرویس دهی درخواست‌های خواندن و نوشتن را تعیین می‌کند. طی روبش تمام درخواست‌ها در صف اول داده‌ها ی اولیه هستند و تمام درخواست‌های جدید در صف داده‌های ثانویه قرار داده می‌شوند. بنا براین سرویس دهی به درخواست‌های جدید به تاخیر می‌افتد تا زمانی که تمام درخواست‌های قدیمی تحت پردازش قرار گیرد. هنگامی که روبش پایان می‌یابد آرم به تمام صف داده‌های اولیه برده می‌شود و دوباره سرتاسر آن شروع می‌شود.







تحلیل الگوریتم

الگوریتم F-SCAN مطابق N-Step-SCAN از چسبانکی آرم جلوگیری می‌کند در صورتی که در الگوریتم‌های دیگر مانند SSTF، SCAN و C-LOOK چنین امری اتفاق نمی‌افتد. چسبانکی آرم در الگوریتم‌های دیگر وقتی رخ می‌دهد که هجمه‌ای از درخواست‌ها برای مسیر مشترک موجب می‌شود تا آرم دیسک توقف پردازش در آن مسیر گردد، از این رو ترجیح داده می‌شود که هیچ جستجوئی برای درخواست‌های آن مسیری که در آن است مورد تایید واقع نشود، از آن جا که F-SCAN درخواست‌ها را به دو صف داده‌ها جدا می‌کند، روبرو شدن با درخواست‌های جدید به صف داده‌های در حال انتظار برده می‌شود، آرم روبش خود را تا مسیر بیرونی ادامه می‌دهد و از این رو چسبانکی پیش روی الگوریتم نیست. یک معاوضه آشکار وجود دارد به طوری که درخواست‌ها در صف داده‌های در حال انتظار باید انتظار طولانی تر تا برای به اجرا درآوردن بکشند، اما در مبادله F-SCAN برای تمام درخواست‌های رضایت بخش تر است.

دیگر متغیرها شامل موارد زیر می‌شود:

الگوریتم آسانسور –اسکن
LOOK (C-LOOK)
N-Step-SCAN






جستجو سه‌تایی

جستجو سه‌تایی

در علوم کامپیوتر رویه ی جستجو ترنری مهارتی برای پیدا کردن مقدار بیشینه و یا کمینه در توابع أکید است. در این رویه مشخص می‌کنیم که مقدار بیشینه یا کمینه تابع نمی‌تواند در یک سوم ابتدا یا انتهای دامنه ی تابع وجود داشته باشد. سپس همین شیوه را بر روی دو سوم باقی‌مانده به کار می‌بریم. جستجو سه‌تایی نمومه‌ای از روش الگوریتم_تقسیم_و_حل است





موتور جستجوی وب
موتور جستجوی وب (به انگلیسی: Web search engine) موتور جستجویی است که برای جستجوی اطلاعات تحت محیط وب طراحی شده‌است.





جستجوگر گوگل
جستجوی گوگل (به انگلیسی: Google search) یک موتور جستجو در وب است که تحت مالکیت گوگل قرار دارد. گوگل از راه این وب‌گاه روزانه صدها میلیون دلار دریافت می‌کند و این وب‌گاه در سال ۱۹۹۷ به وجود آمد. دامنهٔ اصلی این سایت در مه ۲۰۰۸ ۱۳۵ میلیون بار بازدید شده‌است. این موتور جستجو بیشترین بازدیدکننده در بین کاربران را دارد. موتور گوگل روزانه چند صد میلیون بار به طرق مختلف استفاده می‌شود. مهم ترین هدف گوگل یافتن متن مورد نظر در میان صفحات وب است. اما انواع دیگر اطلاعات به وسیله قسمت‌های دیگر آن مثل جستجوی تصاویر گوگل، نیز مورد جستجو قرار می‌گیرند. جستجوگر گوگل توسط لری پیج و سرگئی برین در سال ۱۹۹۷ ساخته شد. این جستجوگر به جز جستجوی واژگان، ۲۲ حالت جستجوی دیگر نیز دارد. مثل جستجوی مترادف‌ها، پیش‌بینی هوا، محدوده‌های زمانی (وقت محلی)، قیمت سهام، اطلاعات زلزله، زمان نمایش فیلم‌ها، اطلاعات فرودگاه و.... همچنین مختص اعداد، امکانات ویژه‌ای وجود دارد مانند بازه (۷۰...۸۰)، دماها، واحدهای پول و تبدیل اینها به هم، عبارات محاسباتی (\tan 30 + \ln y^3 ) و... ترتیب قرارگرفتن نتایج جستجوی گوگل بستگی به عاملی به نام رنک (به انگلیسی: Rank) صفحه دارد. جستجوی گوگل با به کاربردن عملگرهای جبر بولی مانند شمول و عدم شمول گزینه‌های زیادی را برای کاربران قابل تنظیم کرده‌است.(به انگلیسی: Advanced search)







بین‌المللی

گوگل به زبان‌ها و دامنه‌های مختلفی فعالیت می‌کند.

آفریکانس
آلبانیایی
آمهاری
عربی
آرامی
آذربایجانی
باسکی
بلاروسی
بنگالی
بیهاری
بوسنیایی
زبان برتون
بلغاری
خمر
زبان کاتالان
چینی (ساده)
چینی (سنتی)
زبان کرسی
کرواتی
چک



دانمارکی
زبان آلمانی
انگلیسی
اسپرانتو
استونیایی
فارویی
فیلیپینی
فنلاندی
فرانسوی
فریسی غربی
گالیشی
گرجی
آلمانی
یونانی
گوارانی
گجراتی
عبری
هندی
مجاری
ایسلندی



اندونزیایی
زبان اینترلینگوا
ایرلندی
ایتالیایی
ژاپنی
جاوه‌ای
کانارا
قزاقی
کره‌ای
کردی
قرقیزی
لائوسی
لاتین
لتونیایی
زبان لینگالایی
لیتوانیایی
مقدونی
مالایی
زبان مالایالم
مالتی



مائوری
مراتی
مولداویایی (زبان)
مغولی
نپالی
نروژی
نروژی (نو)
اوستی
زبان اوریه
پشتو
فارسی
لهستانی
پرتغالی (برزیل)
پرتغالی (پرتغال)
پنجابی
کویچوا
رومانیایی
رومنش
روسی
زبان گالیک اسکاتلندی



صربی
صربوکرواتی
زبان سوتو
زبان شونا
سندی
سینهالی
اسلواکیایی
اسلوونیایی
سومالی
اسپانیایی
زبان سوندایی
سواحیلی
سوئدی
تاگالوگ
تاجیک
تامیل
تاتار
تلوگو
تایلندی
زبان تیگرینیا
تونگا



ترکی
ترکمنی
زبان اکانی
اویغوری
اکراینی
اردو
ازبکی
ویتنامی
ولزی
خوزا
ییدیش
زبان یوروبایی
زولو







یاهو! جستجو

یاهو! جستجو (به انگلیسی: Yahoo! Search) یک موتور جستجوگر اینترنتی است که در ۱۹۹۵ توسط شرکت یاهو! راه‌اندازی شد. طبق آمار نت اپلیکیشنز (به انگلیسی: Net Applications) یاهو! جستجو دومین موتور جستجوگر پربازدید با ۶٬۴۲% بازدید موتورهای جویشگر پس از جستجوگر گوگل با ۸۵٬۳۵% میزان بازدید و بالاتر از موتور جویشگر بایدو با ۳٬۶۷% است.







زبان‌ها

یاهو! جستجو رابط جستجوگر خود را حداقل در ۳۸ زبان گوناگون و بین‌المللی در دسترس گذاشته‌است.
زبان‌ها

عربی
بلغاری
کاتالان
چینی ساده
چینی سنتی
کرواتی
چکی
دانمارکی
هلندی
انگلیسی
استونیایی
فنلاندی
فرانسوی
آلمانی



یونانی
عبری
مجارستانی
ایسلندی
اندونزیایی
ایتالیایی
ژاپنی
کره‌ای
لتونیایی
لیتوانیایی
مالایی
نروژی
فارسی
لهستانی



پرتغالی
رومانیایی
روسی
صربی
اسلواکیایی
اسلونیایی
اسپانیایی
سوئدی
تاگالوگ
تایلندی
ترکی استانبولی
ویتنامی






الگوریتم جستجوی عمق اول

در نظریه‌ٔ گراف، جستجوی عمق اول (به انگلیسی: Depth-first Search، به‌اختصار DFS) یک الگوریتم پیمایش گراف است که برای پیمایش یا جستجوی یک درخت یا یک گراف به کار می‌رود.

استراتژی جستجوی عمق اول برای پیمایش گراف، همانطور که از نامش پیداست "جستجوی عمیق‌تر در گراف تا زمانی که امکان دارد" است.







چگونه کار می‌کند؟

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

همچنین در مسائلی که حالات مختلف متناظر با رئوس یک گراف‌اند و حل مسئله مستلزم یافتن رأس هدف با خصوصیات مشخصی است، جستجوی عمق اول به صورت غیرخلاق عمل می‌کند. بدین‌ترتیب که هر دفعه الگوریتم به اولین همسایهٔ یک رأس در گراف جستجو و در نتیجه هر دفعه به عمق بیشتر و بیشتر در گراف می‌رود تا به رأسی برسد که همهٔ همسایگانش دیده شده‌اند که در حالت اخیر، الگوریتم به اولین رأسی بر می‌گردد که همسایهٔ داشته باشد که هنوز دیده نشده باشد. این روند تا جایی ادامه می‌یابد که رأس هدف پیدا شود و یا احتمالاً همهٔ گراف پیمایش شود. البته پیاده‌سازی هوشمندانهٔ الگوریتم با انتخاب ترتیب مناسب برای بررسی همسایه‌های دیده نشدهٔ رأس جاری به صورتی که ابتدا الگوریتم به بررسی همسایه‌ای بپردازد که به صورت موضعی و با انتخابی حریصانه به رأس هدف نزدیک‌تر است، امکان‌پذیر خواهد بود که معمولاً در کاهش زمان اجرا مؤثر است.

از نقطه نظر عملی، برای اجرای الگوریتم، از یک پشته (stack) استفاده می‌شود. بدین ترتیب که هر بار با ورود به یک رأس دیده نشده، آن رأس را در پشته قرار می‌دهیم و هنگام عقب‌گرد رأس را از پشته حذف می‌کنیم. بنابراین در تمام طول الگوریتم اولین عنصر پشته رأس در حال بررسی است. جزئیات پیاده‌سازی در ادامه خواهد آمد.

وقتی در گراف‌های بزرگی جستجو می‌کنیم که امکان ذخیرهٔ کامل آنها به علت محدودیت حافظه وجود ندارد، در صورتی که طول مسیر پیمایش شده توسط الگوریتم که از ریشه شروع شده، خیلی بزرگ شود، الگوریتم با مشکل مواجه خواهد شد. در واقع این راه‌حل ساده که "رئوسی را که تا به حال دیده‌ایم ذخیره کنیم" همیشه کار نمی‌کند. چراکه ممکن است حافظهٔ کافی برای این کار نداشته باشیم. البته این مشکل با محدود کردن عمق جستجو در هر بار اجرای الگوریتم حل می‌شود که در نهایت به الگوریتم تعمیق تکراری (Iterative Deepening) خواهد انجامید.







الگوریتم

پیمایش با انتخاب رأس r به عنوان ریشه آغاز می‌شود. r به عنوان یک رأس دیده شده برچسب می‌خورد. رأس دلخواه r_1 از همسایگان r انتخاب شده و الگوریتم به صورت بازگشتی از r_1 به عنوان ریشه ادامه می‌یابد.از این پس در هر مرحله وقتی در رأسی مانند v قرار گرفتیم که همهٔ همسایگانش دیده شده‌اند، اجرای الگوریتم را برای آن رأس خاتمه می‌دهیم. حال اگر بعد از اجرای الگوریتم با ریشهٔ r_1 همهٔ همسایگان r برچسب خورده باشند، الگوریتم پایان می‌یابد. در غیر این صورت رأس دلخواه r_2 از همسایگان r را که هنوز برچسب نخورده انتخاب می‌کنیم و جستجو را به صورت بازگشتی از r_2 به عنوان ریشه ادامه می‌دهیم. این روند تامادامیکه همهٔ همسایگان r برچسب نخورده‌اند ادامه می‌یابد.

البته پیمایش گراف برای تأمین هدفی صورت می‌گیرد. بر این اساس برای انعطاف پذیر ساختن الگوریتم در قبال کاربردهای مختلف، دو نوع عملیات preWORK و postWORK را به همراهِ بازدید از هر رأس یا یال انجام می‌دهیم، که preWORK در زمان برچسب خوردنِ رأسِ در حال بازدید، و postWORK بعد از بررسی هر یالِ خروجی از رأسِ در حال بازدید انجام خواهد شد. هر دوی این عملیات وابسته به هدفِ استفاده از الگوریتم، مشخص خواهند شد.

الگوریتم بازگشتی جستجوی اول عمق به صورت زير است. آرايه يک بعدی Visited تعيين می کند آيا راسی قبلاً ملاقات شده است يا خير





الگوریتم جستجوی اول سطح

در نظریهٔ گراف، جستجوی اول سطح (به انگلیسی: Breadth-first Search، به‌اختصار: BFS) یکی از الگوریتم‌های پیمایش گراف است.

استراتژی جستجوی سطح اول برای پیمایش گراف، همانطور که از نامش پیداست «جستجوی سطح به سطح گراف» است.







چگونه کار می‌کند؟

الگوریتم از ریشه شروع می‌کند (در گراف‌ها و یا درخت‌های بدون ریشه رأس دلخواهی به عنوان ریشه انتخاب می‌شود) و آن را در سطح یک قرار می‌دهد. سپس در هر مرحله همهٔ همسایه‌های رئوس آخرین سطح دیده شده را که تا به حال دیده نشده‌اند بازدید می‌کند و آنها را در سطح بعدی می‌گذارد. این فرایند زمانی متوقف می‌شود که همهٔ همسایه‌های رئوس آخرین سطح قبلاً دیده شده باشند. همچنین در مسائلی که حالات مختلف متناظر با رئوس یک گراف‌اند و حل مسئله مستلزم یافتن رأس هدف با خصوصیات مشخصی است که در عین حال در بین همهٔ رئوس هدف با آن خصوصیات به ریشه نزدیک‌ترین باشد، جستجوی سطح اول به صورت غیرخلاق عمل می‌کند. بدین ترتیب که الگوریتم هر دفعه همهٔ همسایه‌های یک رأس را بازدید کرده و سپس به سراغ رأس بعدی می‌رود و بنابراین گراف سطح به سطح پیمایش خواهد شد. این روند تا جایی ادامه می‌یابد که رأس هدف پیدا شود و یا احتمالاً همهٔ گراف پیمایش شود. براساس آنچه گفته شد پیاده‌سازی هوشمندانهٔ الگوریتم آنقدر مؤثر نخواهد بود.

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







الگوریتم

پیاده‌سازی این الگوریتم مشابه پیاده‌سازی جستجوی عمق اول است با این تفاوت که به جای پشته از صف استفاده می‌شود. در این جا نیز مانند جستجوی عمق اول، preWORK را برای انعطاف بیشتر الگوریتم در نظر می‌گیریم که در زمان بررسی کردن هر رأس خارج شده از صف انجام می‌شود.

الگوريتم جستجوی اول سطح به صورت زير است. آرايه Visited برای تعيين رئوس ملاقات شده بکار می رود. از يک صف برای نگهداشتن رئوس مجاور استفاده می شود. هر بار که راسی ملاقات می شود کليه رئوس مجاور آن در صف اضافه می شود. پيمايش از راسی که از صف برداشته می شود ادامه پيدا می کند.





مرتب‌سازی دایره‌ای

مرتب سازی دایره‌ای (به انگلیسی: Cycle sort) یا مرتب‌سازی درجا یا الگریتم مرتب‌سازی ناپایدار، یک مرتب سازی مقایسه‌ای که تئوری خوبی از نظر تعداد عناصر نوشته‌شده در آرایهٔ اصلی است، بر خلاف تمام الگوریتم‌های مرتب‌سازی. این بر اساس ایده‌ای است که جایگشت می‌تواندفاکتوری برای مرتب سازی باشد، که به صورت جداگانه چرخش برای بدست آمدن نتیجه ایجاد شود.

بر خلاف تمام الگوریتم‌های نزدیک به آن، داده‌ها در جای دیگر آرایه به سادگی نوشته نمی‌شوندتا آن‌ها را از عملیات خارج کنیم. هر مقداردهی در زمان صفر صورت می‌گیرد اگر درآن زمان در مکان درست خودش موجود باشد، ویا در جای درس در یک زمان نوشته می‌شود. این مسابقه نیازمند دوباره کاری کمتری برای مرتب‌سازی درجا است. کم کردن تعداد نوشتن‌ها زمانی که تعداد زیادی از داده‌ها را قرار است که ذخیره کنیم بسیار سودمند است، مانند EEPROM‌ها یا Flash memory که نوشتن عمر مفید دستگاه را کاهش می‌دهد. الگوریتم: الگوریتم زیر پیدا می‌کند با چرخش و دوراندن آن و نتیجهٔ مرتب شده را به ما می‌دهد. توجه داشته‌باشید که range(a, b) از مقدار a تا b – 1 است.





جستجوی ابتدا بهترین

جستجوی بهترین ابتدا (best-first search) یک الگوریتم جستجو است که یک گراف را با بسط دادن محتمل‌ترین نود که بنابر قوانین خاص انتخاب می‌شوند پیمایش می‌کند.

این نوع جستجو را به عنوان تخمین احتمال انتخاب نود N به وسیلهٔ heuristic evaluation function که به صورت کلی، ممکن است بر پایه توصیف N، توصیف هدف، اطلاعات جمع اوری شده به وسیلهٔ جستجو تا ان نقطه و هر گونه اطلاعات اضافی در زمینهٔ مساله توصیف می‌کند.

بعصی از نویسندگان از جستجوی اولویت بهترین‌ها استفاده می‌کنند تا به طور خاص به یک جستجو با یک اشاره کنند که تلاش می‌کند تا پیش‌بینی کند که چقدر پایان یک مسیر به راه حل نزدیکتر است، بنابر این ان مسیرهایی که نزدیکتر به جواب هستند اول بسط داده شوند. الگوریتم جستجوی یک نمونه از الگوریتم بهترین‌ها-اول است. الگوریتم بهترین‌ها-اول معمولاً برای پیدا کردن پیدا کردن مسیر در جستجوهای ترکیبی استفاده می‌شود.
page1 - page2 - page3 - page4 - page5 - page7 - page8 - | 7:24 pm
خط مشی جاوا

یکی از ویژگی‌های جاوا قابل حمل بودن آن است. یعنی برنامهٔ نوشته شده به زبان جاوا باید به طور مشابهی در کامپیوترهای مختلف با سخت‌افزارهای متفاوت اجرا شود. و باید این توانایی را داشته باشد که برنامه یک بار نوشته شود، یک بار کامپایل شود و در همه کامپیوترها اجرا گردد. به این صورت که کد کامپایل شدهٔ جاوا را ذخیره می‌کند، اما نه به‌صورت کد ماشین بلکه به‌صورت بایت‌کد جاوا. دستورالعمل‌ها شبیه کد ماشین هستند، اما با ماشین‌های مجازی که به طور خاص برای سخت‌افزارهای مختلف نوشته شده‌اند، اجرا می‌شوند. در نهایت کاربر از سکوی جاوا نصب شده روی ماشین خود یا مرورگر وب استفاده می‌کند. کتابخانه‌های استاندارد یک راه عمومی برای دسترسی به ویژگی‌های خاص فراهم می‌کنند. مانند گرافیک، نخ‌کشی و شبکه. در بعضی از نسخه‌های ماشین مجازی جاوا، بایت‌کدها می‌توانند قبل و در زمان اجرای برنامه به کدهای محلی کامپایل شوند. فایدهٔ اصلی استفاده از بایت‌کد، قسمت کردن است. اما ترجمهٔ کلی یعنی برنامه‌های ترجمه شده تقریباً همیشه کندتر از برنامه‌های کامپایل شدهٔ محلی اجرا می‌شوند. این شکاف می‌تواند با چند تکنیک خوش‌بینانه که در کاربردهای JVM قبلی معرفی شد، کم شود. یکی از این تکنیک‌ها JIT است که بایت‌کد جاوا را به کد محلی ترجمه کرده و سپس آن را پنهان می‌کند. در نتیجه برنامه خیلی سریع‌تر نسبت به کدهای ترجمه شدهٔ خالص شروع و اجرا می‌شود. بیشتر VMهای پیشرفته، به‌صورت کامپایل مجدد پویا، در آنالیز VM، رفتار برنامهٔ اجرا شده و کامپایل مجدد انتخاب شده و بهینه‌سازی قسمت‌های برنامه، استفاده می‌شوند. کامپایل مجدد پویا می‌تواند کامپایل ایستا را بهینه‌سازی کند. زیرا می‌تواند قسمت hot spot برنامه و گاهی حلقه‌های داخلی که ممکن است زمان اجرای برنامه را افزایش دهند را تشخیص دهد. کامپایل JIT و کامپایل مجدد پویا به برنامه‌های جاوا اجازه می‌دهد که سرعت اجرای کدهای محلی بدون از دست دادن قابلیت انتقال افزایش پیدا کند.





تکنیک بعدی به عنوان کامپایل ایستا شناخته شده‌است. که کامپایل مستقیم به کدهای محلی است مانند بسیاری از کامپایلرهای قدیمی. کامپایلر ایستای جاوا، بایت‌کدها را به کدهای شی محلی ترجمه می‌کند.

کارایی جاوا نسبت به نسخه‌های اولیه بیشتر شد. در تعدادی از تست‌ها نشان داده شد که کارایی کامپایلرJIT کاملاًَ مشابه کامپایلر محلی شد. عملکرد کامپایلرها لزوماً کارایی کدهای کامپایل شده را نشان نمی‌دهند. یکی از پیشرفت‌های بی نظیر در در زمان اجرای ماشین این بود که خطاها ماشین را دچار اشکال نمی‌کردند. علاوه بر این در زمان اجرای ماشینی مانند جاوا وسایلی وجود دارد که به زمان اجرای ماشین متصل شده و هر زمانی که یک استثنا رخ می‌دهد، اطلاعات اشکال زدایی که در حافظه وجود دارد، ثبت می‌کنند.


پیاده‌سازی
شرکت سان میکروسیستم مجوز رسمی برای پلت فرم استاندارد جاوا را به مایکروسافت ویندوز, لینوکس، و سولاریس (سیستم‌عامل). داده‌است. همچنین محیط‌های دیگری برای دیگر پلت فرم‌ها فراهم آورده‌است. علامت تجاری مجوز شرکت سان میکروسیستم طوری بود که با همهٔ پیاده‌سازی‌ها سازگار باشد. به علت اختلاف قانونی که با ماکروسافت پیدا کرد، زمانی که شرکت سان ادعا کرد که پیاده‌سازی ماکروسافت از RMI یا JNI پشتیبانی نکرده و ویژگی‌های خاصی را برای خودش اضافه کرده‌است. شرکت سان در سال ۱۹۹۷ پیگیری قانونی کرد و در سال ۲۰۰۱ در توافقی ۲۰ میلیون دلاری برنده شد. در نتیجه کمی بعدماکروسافت جاوا را به ویندوز فرستاد. در نسخهٔ اخیر ویندوز، مرورگر اینترنت نمی‌تواند از جاوا پلت فرم پشتیبانی کند. شرکت سان و دیگران یک سیستم اجرای جاوای رایگان برای آنها و نسخه‌های دیگر ویندوز فراهم آوردند.
اداره خودکار حافظه

جاوا از حافظهٔ بازیافتی خودکار برای ادارهٔ حافظه در چرخهٔ زندگی یک شی استفاده می‌کند. برنامه‌نویس زمانی که اشیا به وجود می‌آیند، این حافظه را تعیین می‌کند. و در زمان اجرا نیز، زمانی که این اشیا در استفادهٔ زیاد طولانی نباشند، برنامه نویس مسئول بازگرداندن این حافظه‌است. زمانی که مرجعی برای شی‌های باقی‌مانده نیست، شی‌های غیر قابل دسترس برای آزاد شدن به صورت خودکار توسط بازیافت حافظه، انتخاب می‌شوند. اگر برنامه‌نویس مقداری از حافظه را برای شی‌هایی که زیاد طولانی نیستند، نگه دارد، چیزهایی شبیه سوراخ حافظه اتفاق می‌افتند.

یکی از عقایدی که پشت سر مدل ادارهٔ حافظهٔ خودکار جاوا وجود دارد، این است که برنامه‌نویس هزینهٔ اجرای ادارهٔ دستی حافظه را نادیده می‌گیرد. در بعضی از زبان‌ها حافظه لازم برای ایجاد یک شی، به صورت ضمنی و بدون شرط، به پشته تخصیص داده می‌شود. و یا به‌طور صریح اختصاص داده شده و از heap بازگردانده می‌شود. در هر کدام از این راه‌ها، مسئولیت ادارهٔ اقامت حافظه با برنامه‌نویس است. اگر برنامه شی را برنگرداند، سوراخ حافظه اتفاق می‌افتد. اگر برنامه تلاش کند به حافظه‌ای را که هم‌اکنون بازگردانده شده، دستیابی پیدا کند یا برگرداند، نتیجه تعریف شده نیست و ممکن است برنامه بی‌ثبات شده و یا تخریب شود. این ممکن است با استفاده از اشاره‌گر مدتی باقی بماند، اما سرباری و پیچیدگی برنامه زیاد می‌شود. بازیافت حافظه اجازه دارد در هر زمانی اتفاق بیفتد. به‌طوری که این زمانی اتفاق می‌افتد که برنامه بی‌کار باشد. اگر حافظهٔ خالی کافی برای تخصیص شی جدید در هیپ وجود نداشته باشد، ممکن است برنامه برای چند دقیقه متوقف شود. در جایی که زمان پاسخ یا اجرا مهم باشد، ادارهٔ حافظه و منابع اشیا استفاده می‌شوند.

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

گرامر
گرامر جاوا وسیع‌تر از ++C است و برخلاف ++C که ترکیبی است از ساختارها و شی‌گرایی، زبان جاوا یک زبان شی‌گرای خالص می‌باشد. فقط نوع دادة اصلی از این قاعده مستثنی است. جاوا بسیاری از ویژگی‌ها را پشتیبانی می‌کند و از کلاس‌ها برای ساده‌تر کردن برنامه‌نویسی و کاهش خطا استفاده می‌کند.



بر طبق قرارداد فایل هل بعد از کلاس‌های عمومی نام گذاری می‌شوند. سپس باید پسوند java را به این صورت اضافه کرد: Hello world.java. این فایل اول باید با استفاده از کامپایلر جاوا به بایت کد کامپایل شود. در نتیجه فایل Hello world.class ایجاد می‌شود. این فایل قابل اجرا است. فایل جاوا ممکن است فقط یک کلاس عمومی داشته باشد. اما می‌تواند شامل چندین کلاس با دستیابی عمومی کمتر باشد.

کلاسی که به صورت خصوصی تعریف می‌شود ممکن است در فایل.java ذخیره شود. کامپایلر برای هر کلاسی که در فایل اصلی تعریف می‌شود یک کلاس فایل تولید می‌کند. که نام این کلاس فایل همنام کلاس است با پسوند.class

کلمه کلیدی public (عمومی) برای قسمت‌هایی که می‌توانند از کدهای کلاس‌های دیگر صدا زده بشوند، به کار برده می‌شود. کلمهٔ کلیدی static (ایستا) در جلوی یک تابع، یک تابع ایستا را که فقط وابسته به کلاس است و نه قابل استفاده برای نمونه‌هایی از کلاس، نشان می‌دهد. فقط تابع‌های ایستا می‌توانند توسط اشیا بدون مرجع صدا زده شوند. داده‌های ایستا به متغیرهایی که ایستا نیستند، نمی‌توانند دسترسی داشته باشند.

کلمهٔ کلیدی void (تهی) نشان می‌دهد که تابع main هیچ مقداری را بر نمی‌گرداند. اگر برنامهٔ جاوا بخواهد با خطا از برنامه خارج شود، باید system.exit() صدا زده شود. کلمهٔ main یک کلمهٔ کلیدی در زبان جاوا نیست. این نام واقعی تابعی است که جاوا برای فرستادن کنترل به برنامه، صدا می‌زند. برنامه جاوا ممکن است شامل چندین کلاس باشد که هر کدام دارای تابع main هستند.

تابع main باید آرایه‌ای از اشیا رشته‌ای را بپذیرد. تابع main می‌تواند از آرگومان‌های متغیر به شکل public static void main(string…args) استفاده کند که به تابع main اجازه می‌دهد اعدادی دلخواه از اشیا رشته‌ای را فراخوانی کند. پارامترstring[]args آرایه‌ای از اشیا رشته ایست که شامل تمام آرگومان‌هایی که به کلاس فرستاده می‌شود، است.

چاپ کردن، قسمتی از کتابخانهٔ استاندارد جاوا است. کلاس سیستم یک فیلد استاتیک عمومی به نام out تعریف کرده‌است. شی out یک نمونه از کلاس printstream است و شامل تعداد زیادی تابع برای چاپ کردن اطلاعات در خروجی استاندارد است. همچنین شامل println(string) برای اضافه کردن یک خط جدید برای رشتهٔ فرستاده شده اضافه می‌کند.
توزیع‌های جاوا

منظور از توزیع جاوا پیاده‌سازی‌های مختلفی است که برای کامپایلر جاوا و همچنین مجموعه کتابخانه‌های استاندارد زبان جاوا (JDK) وجود دارد. در حال حاضر چهار توزیع‌کنندهٔ عمده جاوا وجود دارند:

سان میکروسیستمز: توزیع کننده اصلی جاوا و مبدع آن می‌باشد. در اکثر موارد هنگامی که گفته می‌شود جاوا منظور توزیع سان می‌باشد.
GNU Classpath: این توزیع از سوی موسسه نرم‌افزارهای آزاد منتشر شده و تقریباً تمامی کتابخانه استاندارد زبان جاوا در آن بدون بهره‌گیری از توزیع شرکت سان از اول پیاده‌سازی شده‌است. یک کامپایلر به نام GNU Compiler for Java نیز برای کامپایل کردن کدهای جاوا توسط این موسسه ایجاد شده‌است. فلسفه انتخاب نام Classpath برای این پروژه رها کردن تکنولوژی جاوا از وابستگی به علامت تجاری جاوا است بطوریکه هیچ وابستگی یا محدودیتی برای استفاده آن از لحاظ قوانین حقوقی ایجاد نشود و از طرفی به خاطر وجود متغیر محیطی classpath در تمامی محیط‌های احرایی برنامه‌های جاوا، این نام به نوعی تکنولوژی جاوا را برای خواننده القا می‌کند. کامپایلر GNU توانایی ایجاد کد اجرایی (در مقابل بایت کد توزیع سان) را داراست. لازم به ذکر است که در حال حاضر شرکت سان تقریباً تمامی کدهای JDK را تحت مجوز نرم‌افزارهای آزاد به صورت متن باز منتشر کرده‌است و قول انتشار قسمت بسیار کوچکی از این مجموعه را که به‌دلیل استفاده از کدهای شرکت‌های ثانویه نتوانسته به صورت متن باز منتشر نماید در آینده نزدیک با بازنویسی این کدها داده‌است.
مایکروسافت #J: این در حقیقت یک توزیع جاوا نیست. بلکه زبانی مشابه می‌باشد که توسط مایکروسافت و در چارچوب.net ارائه شده‌است. انتظار اینکه در سیستم‌عاملی غیر از ویندوز هم اجرا شود را نداشته باشید.
AspectJ: این نیز یک زبان مجزا نیست. بلکه یک برنامه الحاقی می‌باشد که امکان برنامه نویسی Aspect Oriented را به جاوا می‌افزاید. این برنامه توسط بنیاد برنامه‌نویسی جلوه‌گرا و به صورت کدباز ارائه شده‌است.



کلاس‌های خاص

برنامک (برنامه‌های کاربردی کوچک)

اپلت جاواها برنامه‌هایی هستند که برای کاربردهایی نظیر نمایش در صفحات وب، ایجاد شده‌اند. واژهٔ import باعث می‌شود کامپایلر جاوا کلاس‌های javaapplet.Applet وjava.awt.Graphics را به کامپایل برنامه اضافه کند. کلاس Hello کلاس Applet را توسعه می‌دهد. کلاس اپلت چارچوبی برای کاربردهای گروهی برای نمایش و کنترل چرخهٔ زندگی اپلت، درست می‌کند. کلاس اپلت یک تابع پنجره‌ای مجرد است که برنامه‌های کوچکی با قابلیت نشان دادن واسط گرافیکی برای کاربر را فراهم می‌کند. کلاس Hello تابع موروثی print(Graphics) را از سوپر کلاس container باطل می‌کند، برای اینکه کدی که اپلت را نمایش می‌دهد، فراهم کند. تابع paint شی‌های گرافیکی را که شامل زمینه‌های گرافیکی هستند را می‌فرستد تا برای نمایش اپلت‌ها استفاده شوند. تابع paint برای نمایش "Hello world!" تابع drawstring(string,int,int) را صدا می‌زند.

جاوا سرولت
تکنولوژی servlet جاوا گسترس وب را به آسانی فراهم می‌کند. و شامل مکانیزم‌هایی برای توسعهٔ تابعی سرور وب و برایدسترسی به سیستم‌های تجاری موجود است.servlet قسمتی از javaEE است که به درخواست‌های مشتری پاسخ می‌دهد.

واژهٔ import کامپایلر جاوا را هدایت می‌کند که تمام کلاس‌های عمومی و واسط‌ها را از بسته‌های java.io وjava.servlet را در کامپایل وارد کند.

کلاس Hello کلاس Genericservlet را توسعه می‌دهد. کلاس Genericservlet واسطی برای سرور فراهم می‌کند تا درخواست را به servlet بفرستد و چرخهٔ زندگی servlet را کنترل کند.
JSP
صفحهٔ سرور جاوا قسمتی از سرور javaEE است که پاسخ تولید می‌کند. نوعاً صفحات HTML به درخواست‌های HTTP از مشتری.JSPها کد جاوا در صفحهٔ HTML را با استفاده از حائل <%and%> اضافه می‌کنند.JSP به javaservlet کامپایل می‌شود.

سوینگ
Swing کتابخانهٔ واسط گرافیکی کاربر است برای پلت فرم javaSE. ابزاری مشابه پنجره، GTK و motif توسط شرکت sun فراهم شده‌اند. این مثال کاربرد swing یک پنجرهٔ واحد همراه با Hello world را ایجاد می‌کند.

اولین جملهٔ import کامپایلر جاوا را هدایت می‌کندتا کلاس Borderlayout را از بستهٔ java.awt در جاوا به کامپایل اضافه کند. و import دوم همهٔ کلاس‌های عمومی و واسط آن‌ها را از بستهٔ javax.swing اضافه می‌کند. کلاس Hello کلاس Jframe را توسعه می‌دهد. کلاس Jframe یک پنجره با میلهٔ عنوان و کنترل بستن است.

زمانی که برنامه آغاز می‌شود، تابع main با JVM صدا زده می‌شود. این یک نمونهٔ جدید از کلاس Hello را ایجاد کرده و با صدا زدن تابع setvisible(boolean) با مقدار true نمایش داده می‌شود.
 
ساعت : 7:24 pm | نویسنده : admin | مطلب قبلی | مطلب بعدی
جاوا | next page | next page