ورود

View Full Version : مجموعه توانی



علی اکبر
سه شنبه 06 بهمن 1388, 09:04 صبح
سلام
سؤال از این قراره که یه مجموعه داریم و میخایم تمام زیر مجموعه هاشو بدست بیاریم
مثال 1: مجموعه {1,2,3} زیر مجموعه هاش میشن

{1}, {2}, {3} , {1,2}, {1,3} , {2,3} ,{1,2,3} ومجموعه تهی که جمعا هشت تا میشه

مثال 2: مجموعه {1,2,3,4,5} که زیر مجموعه هاش از این قراره

{1}, {2}, {3} {4}, {5} , {1,2} , {1,3} {1,4} , {1,5} , {2,3}, {2,4}, {2,5} , {3,4} ,{3,5} ,{4,5}

{1,2,3},{1,2,4},{1,2,5},{1,3,4},{1,3,5},{1,4,5},{2 ,3,4},{2,3,5},{2,4,5},{3,4,5}

{1,2,3,4},{1,2,3,5},{1,2,4,5},{1,3,4,5} , {2,3,4,5}, {1,2,3,4,5} وآخرین زیر مجموعه تهی هستش جمعا 32

تعداد زیر مجموعه ها با احتساب زیر مجموعه تهی برابر با: دو بتوان N میباشد
N تعداد اعضا میباشد
خیلی سعی کردم الگوریتم با استفاده از آرایه ها ودر حلقه بنویسم اما حالتهای تکراری زیادی بوجود میاد که در نتیجه عضو های تکراری رو حذف کردم اما ووقتی تعداد عضو زیاده خیلی خیلی طول میکشه
دوستان الگوریتم بابت این موضوع می تونن پیشنهاد کنند
ضمنا اینجا چند الگوریتم البته به زبانهای مختلف هست اما من متوجه نشدم
http://forum.persiantools.com/showthread.php?t=70559
ممنون

علی اکبر
سه شنبه 06 بهمن 1388, 09:09 صبح
اینم یه ادرس دیگه
http://barnamenevis.org/forum/showthread.php?t=7063

mehran_337
سه شنبه 06 بهمن 1388, 09:22 صبح
یه بار مشابه همچین کاری می خواستم انجام بدم.وقتی مجموعه 3 عضو دارد روش بدین صورت بود
از 0 تا 7 در یک حلقه for قرار دادمو هر عدد را به مبنای دودویی تا 3 بیت حساب کردم
000-001-010-011-100-101-110-111
حالا هر جا عدد 1 دیدیم اندیسشو بر می داریم و در مجموعه مراجعه می کنیم و عنصر متناظر با اون اندیس و بر می داریم مثلا اگه مجموعه 1-2-5 باشد داریم:
000-001-020-021-500-501-520-521
که اگر صفرها رو حذف کنیم داریم :
0-1-2-21-5-51-52-521

اینهم یه تابع برای تبدیل عدد به دودویی . در این تابع 2 پارمتر دریافت می کند اولی عددی که می خواهیم تبدیل شود و دومی تعداد بیتها مثلا می خواهیم عدد 5 را تا 3 بیت به دودویی تبدیل کند
wait wind num2dodo(5,3)



FUNCTION num2dodo
PARAMETERS varno , lena

IF EMPTY(lena)
lena = 1
ENDIF
sen = ""
DO WHILE varno => 1

baghi = ALLTRIM(STR(MOD(varno,2)))
sen = baghi + sen
varno = int(varno / 2)
ENDDO
sen = ALLTRIM(sen)
IF LEN(sen) < lena
sen = REPLICATE("0",LENA - LEN(sen)) + sen
ENDIF
RETURN sen

علی اکبر
سه شنبه 06 بهمن 1388, 10:52 صبح
عالی
خیلی خیلی ممنون