ورود

View Full Version : سوال: نمایش تعداد حالات یک جایگشت



mehran_337
یک شنبه 29 آذر 1388, 07:39 صبح
با سلام
اگر اعداد 1 تا 9 داشته باشیم چگونه می توان تمام اعدادی که با این ارقام می توان ساخت (مثلا 9 رقمی) نمایش داد ؟ یا اگر حروف a تا f داشته باشیم تمام کلماتی که با این حروف می توان ساخت را می خواهیم نمایش دهیم.(داده ها متغیر هستند مثلا ممکنه 5 رقم باشد یا 15 رقم)
البته من برای این مسئله راه های زیاد را رفتم اما وقتی داده های مسله زیاد می شود مدت زمان زیادی طول می کشه تا پردازش انجام بشه.
مثلا 9 تا جدول ساختم هر کدوم 1 تا 9 بعد با دستور select یک کوئری از همه گرفتم ولی در تعداد 2 الی 5 جدول خوب جواب می ده بیشتر که باشه زمان بر هست.
روش بعدی درون حلقه ای شمارنده گذاشت و در هر بار چک می کرد اگر ارقام تکراری در عبارت وجود داشت به سراغ عدد بعدی می رفت که این هم برای بعضی اعداد بسیار زمان بر بود مثلا عبارت 15 رقمی باید از عدد 100000000000000 شروع بشود و الی ماشاا...
اگر دوستان راهی به نظرشون می رسه راهنمایی کنند
با تشکر

amir.azimi2000
یک شنبه 29 آذر 1388, 09:46 صبح
با سلام .
مهران جان من هم همین مشکل را دارم .
میخواستم برنامه ای جهت پیدا کردن کلمه عبوری بنویسم که ممکنه از سه کاراکتر تا پانزده کاراکتر باشه و هر کدام از این کاراکترها ممکنه حرف و یا عدد باشند حروف و اعداد ممکنه تکراری هم باشند .
راه های مختلفی را تست کردم ولی علاوه بر زمان بر بودن اجرای برنامه ، به نتیجه درستی هم نرسیدم .
اگر از اساتید محترم کسی بتونه راهنمایی کنه خیلی ممنون میشوم .
ضمنا زمان بر بودن اجرای برنامه هم باتوجه به پردازش زیاد قابل قبول است .
با سپاس .

binyaz2003
یک شنبه 29 آذر 1388, 09:55 صبح
خوب فرق ميکنه.با جايگشت باشه يا نباشه.تکراري داشته باشه يا نه.
نه که مثلا کنکوري ام يک کم آمار ميخونم.

mehran_337
یک شنبه 29 آذر 1388, 10:54 صبح
روش بعدی درون حلقه ای شمارنده گذاشت و در هر بار چک می کرد اگر ارقام تکراری در عبارت وجود داشت

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

mehran_337
دوشنبه 30 آذر 1388, 10:25 صبح
شاید مثال واضحتریم بزنم دوستان راحت تر بتونن روش فکر کنن
می خواهیم با اعداد 1 و 2 و 3 اعداد دو رقمی داشته باشیم
کل اعداد می شه : 11و12و13و21و22و23و31و32و33

شرط برنامه اینه که اولا ارقام تکراری نباشه مثلا 11و22و33 باید حذف بشه و دوما اینکه ارقام جابجا شده قبول نیست مثلا
اگه 12 داریم 21 قابل قبول نباشه. یا اگر 31 داریم 13 نداشته باشیم.


خب !
اگر دوتا جدول داشته باشیم که هر کدوم 3 رکورد با مقدایر رکورد اول عدد 1 رکورد دوم عدد2 و رکورد سوم عدد 3 داشته باشند کافیه بنویسیم :


select * from tbl1,tbl2


حالا جدول سومی داریم که 2 فیلد داره و می تونیم با در کنار قرار دادن فیلدها عدد 2 رقمی داشته باشیم.
چون 9 رکورد بیشتر نداریم (3 به توان 2 ) براحتی می تونیم توی یه حلقه scan بگیم اعداد تکراری رو حذف کنه.
اما اگه مسئله بشه :
با اعداد 1 تا 9 چند تا عدد 6 رقمی با شرط بالا درست کرد ؟
کل حالات 9 به توان 6 حالت وجود داره که بعد باید بگردیم حالات تکراری رو حذف کنیم تا چیزی که می خواهیم بدست بیاریم .
حتی ممکنه درست کردن این کوئری با پیغام is too larg مواجه بشه . در حین کوئری هم سعی کردم شرط و اعمال کنم یعنی در قسمت where تابعی نوشتم که اول تکراری بودن عبارت و بررسی کنه کله با این عدد زمان زیادی گرفته می شه که اصلا معقول نیست.
حالا اگه دوستان راه بهتری سراغ دارن مطرح کنند تا ببینیم چی می شه