الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

خوارزمية لايجاد المجموعات الجزئية؟؟؟؟؟؟؟

مغلق
بدأه kitty في 18 يونيو 2004 · 8 رد · 3,430 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم!

هاهو سؤالى نقلته كما طلبت يا اخ هيثم:

هذه خوارزمية لايجاد جميع تجزيئات المجموعة {n,.......,2,1}ولكن لم استطع فهمها فهلا ساعدتمونى بشرحها تفصيليا.

الخوارزمية:

first subset is x.

next subset after y:

find the last element i not in y (working back form the end.

if theer's no such eelment ,then y was the last subse.

remove from y all elements after i,and add i to y .return this set.

و كذلك الخوارزمية الخاصة بايجاد جميع المجموعات الجزئية من {1,.........,n}و التى رتبتها k:

First subset is

{1,.....,k}

Next subset after Y={y1,....yk} where y1<....<yk;

Find the first i such that yi+1 doesnt belong to Y;

increase`y1`by 1, set yj=j for j<i, and return the new set Y;

this fails if i=k,yk=n, in which case Y={n-k+1,...,n} is the last set.

#2

السلام عليكم ,,

السؤال بصيغة أخرى ,,

اذا كانت لدينا مجموعة كالتالي :

{1,2,3,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

نلاحظ أن عددها الكلي هو 10 ,, وهي القيمة 5 توافيق 3 ,, وتساوي 10 ,,

الان كيف يمكن كتابة برنامج كهذا ؟

النظرية صعبة قليلا وتحتاج للكثير من التفكير ,, فهذا برنامج من أبو نوع تفكير ,, وليس له علقة باحتراف لغة برمجة أم لا ,, لأننا سنتخدم فيه كلمات أساسية ي لغة البرمجة كال for والمصفوفات فقط ,,

المهم الكود التالي ,, بدأت فيه اليوم صباحا أمام الكمبيوتر ,, ولم أجد الوقت الكافي لنتهي ,, فأكملته على الورق ,, وسيعمل باذن الله باحنمال 80 % لأن لم أجربه مرة أخرى ,, عموما حتى يوم غد سأعود لجهزي مرة أخرى وسأجربه ,,

الكود :

#include <iostream.h>


int Fact(int x)
{
int r =1;
for(int q=1;q<x;q++)
{
	r=r*q;
}
}


int T(int x,int y)
{
 return (Fact(x)/(Fact(x-y)*Fact(y)));
}

void main()
{

int char_num=5;
int STR = 3;
char STRING[char_num]={'1','2','3','4','5'};
int pos[STR+1];int count[STR+1];

int POW;

for(int e=0;e<STR+1;e+)
{
count[e]=0;
pos[e]=e;
}
pos[0]=-1;

for(int q=0;q<T(char_num;STR);q++)
{
for(int w=0;w<STR;w++)
{

POW= T(char_num-pos[w+1],STR-w-1);

if(count[w]%POW==0)
{
pos[w]++;
count[w+1]=0;
count[w]=0;
pos[w+1]=pos[w];
}

count[w]++;

cout<<pos[w];
}
}


//End main
}

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#3

انا فهمت من سؤالك انك تريد الجواب عن طريق data structure مثل linked listس

اذا انا مخطيء قوللي حتى لا اكمل ما اقوم به

انتظر ردك

السلام عليكم

"خيركم من تعلم العلم وعلمه". ..........استغفر الله. ........ اللهم صلي وسلم على سيدنا محمد

احمد عبد الحميد ابوغرارة

CodeGuru CodeProject CGTalk

#4

السلام عليكم ,,

يا ahmed_3d : السؤال كما وضحت في الأعلى وأنا متأكد من ذلك :) ,, ولايتاج ل Linklist أو ماشابه ذلك ,, لكن يحتاج لبعض التفكير فقط ,, فاذا وجدت متسعا من الوقت وكنت تحب مثل هذه الأمور ,, فجرب فلربما انتهينا بشكل أسرع :)

...............

بالنسبة لبرنامج فهو يعمل لكن توجد أخطاء املائية مثل كتابة const قبل المتغيرين :

const int char_num=5;
const int STR = 3;

وربما بعض الفواصل المنقوطة من هنا وهناك ,, المهم ,,

يوجد خطأ منطقي أيضا ,, جربت البرنامج في جهاز كمبيوتر ,, ولم أجد الوقت لاصلاحه ,, لكن الخطأ باحتمال كبير في السطر :

if(count[w]%POW==0)

يجب أن يصبح :

if(count[w]%(POW+1)==0)

عموما أسأل الله ان لاتحدث مشكلة غدا لأجرب البرنامج بارتياح :) ,,

بالتوفيق ,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#5

السلام عليكم ,,

هاقد عدت اخييرا ومعي الحل الكامل !!

اليكي الحل ,, لايجاد المجموعات الجزئية ب STR عنصر من أصل char_num عنصر ,,وسيكون عددها بتوافيق char_num اختيار STR ,,

الكود :

#include <iostream.h>

int Fact(int x)
{
int r =1;
for(int q=1;q<x;q++)
r=r*q;

return r;
}


int T(int x,int y)
{
return (Fact(x)/(Fact(x-y)*Fact(y)));
}

void main()
{

const int char_num=5;
const int STR = 3;
char STRING[char_num]={'1','2','3','4','5'};
int pos[STR+1];int count[STR+1];

int POW;

for(int e=0;e<STR+1;e+)
{
count[e]=0;
pos[e]=e;
}


for(int q=0;q<T(char_num;STR);q++)
{
for(int w=0;w<STR;w++)
{

POW= T(char_num-pos[w]-1,STR-w-1);

if(count[w]%POW==0)
{
pos[w]++;
count[w+1]=0;
count[w]=0;
pos[w+1]=pos[w];
}

count[w]++;

cout<<STRING[pos[w]];
}
cout <<endl;
}


cin.get();

//End main
}

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#6

السلام عليكم ,,

بعد التغيير قيم المتغيرين char_num و STR ,, يمكن الحصول علىة مجموعات جزئية بعدد STR خانة من أصل char_num خانة ,, "يجب أن تكون char_num أكبر من أو تساوي STR والا سيفشل البرنامج ويعرض Exception "

يمكن جعل التغيير داخل For Loop لعرض كل المجموعات الجزئية ب 2 أس char_num خانة :)

طبعا بعد تمديد سلسلة المجموعة الأصلية STRING بعدد char_num ,, والا سيفشل البرنامج أيضا ,,

مشكلة البرنامج كانت في جزئية بسيطة جدا ,, وقد ضيعت منى حوالي ساعتين للأسف ,, وبعد ان ارتفع ضغطي ابتعدت عن الجهاو ,, وصليت المغرب ,, وتوكلت على الله وعرفت المشكلة فورا !!!

كانت فقط في :

POW= T(char_num-pos[w+1],STR-w-1);

وغيرتها الى

POW= T(char_num-pos[w]-1,STR-w-1);

هذا السطر هو مربض فرس البرنامج ,, يعني بسبب ال -1 ضيعت ساعتين ,,

مجموع الوقت الذي قضيته في البرنامج 6 ساعات في 4 أيام تقريبا !!

3 ساعات للفكرة والباقي عواسة في الكود !! والحمد لله ,,,

المهم فكرة البرنامج كالتالي :

هي أن نحرك خانات كل عد بعد عدد مرات بالنسبة للعدد التالي !!

يعني سأحرك العدد في الخانة الاولى ليكون في الخانة الثانية بعدد توافيق باقي الخانات باختيار باقي خانات ال STR !!

الشرح معقد ,, لذا أنا منسحب p:

اذا كان هناك تعليق تابعي لنتابع معك ,,

بالتوفيق ,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#7

السلام عليكم!

اولا انا لم اسجل دخولى منذ مدة واسفة على التاخر فى الرد ,و الحمد لله هانتذا قد قدمت لى الحل(ساجربه اليوم إن شاء الله) ولا اعرف كيف اشكرك على مجهودك الرائع .

بالنسبة لقوانين المنتدى فانا لا ارىانك قد خالفتها على الاطلاق فالبرنامج مطلوب بلغة الجافا( lol) واسفة فعلا على التعب وتضييع الوقت الذى تسبب به البرنامج وشكرا مرة اخرى.

#8

على الرحب والسعة ,, في أي وقت :)

وفقكم الله ,,

banner_60_468.gif

NOTHING IS IMPOSSIBLE

#9

تم النقل من قسم سي++

banner_60_468.gif

NOTHING IS IMPOSSIBLE

هذا الموضوع مغلق.

مواضيع مشابهة