PDA

View Full Version : مشکل در زمان اجرای یک قطعه کد



narges_j
پنج شنبه 02 آبان 1392, 21:01 عصر
سلام
من یک الگوریتم نوشتم که یک تیکه از کدش زمان اجرا را به بالای نیم ساعت می بره...اگر مطرحش کنم کسی کمک میکنه که طوری بنویسمش که کمتر بشه؟

aliagamon
پنج شنبه 02 آبان 1392, 21:09 عصر
خوب شما بزارین الگوریتم رو چون معلوم نیست بشه کمک کرد یا نه....بهتره بزارین بچه ها بررسی کنن ...

narges_j
پنج شنبه 02 آبان 1392, 21:27 عصر
میدونید منطق برنامه طوری که درکش یکم سخت به خاطر همین من فقط همون یکه کد را میگم
من 3 تا تابع دارم
تابع اول همه سزرها را میخونه و ایتم ها را از توی ان جدا میکنه....فرض کنید ایتم های a, b, c, d, e, را در اوردیم ....این تابع مشکلی نداره
تابع دوم تعداد این ایتم ها را در کل سطرها بدست میاره ...تا این جاش مشکلی نداره ولی بعد که ایتم زیاد میشن یکم مشکل دار میشه...
تابع سوم همه ترکیب ها این ایتم ها را بدست میاره مثلا ab,ac,ad,....abc,abd,,,,abcd,abce,,,,
خب این تابع بصورت تو در تور همو فراخوانی میکنن نتیجه این تابع ها هر بار توسط یه تابع دیگه یکسری محاسبات روش انجام میده که بعضی از این حالتها از بین میرند.....


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

این فقط یک تیکه از الگوریتم بود ...حالا این الگوریتم باید روی دیتابیس های که بالای 3000 سطر دارند کار کنه.....تعداد این حالتها یک جایی به 28000 به بالا میرسه..من سعی کردم طوری بنویسم که زمان کمتری بگیره ولی نشد..این هم کد
temp یک لیست که بصورت واست عمل میکنه
Itemset یک لیستی که هر بار یک سری حالت در آن هست و باید حالتهاش با هم ترکیب بشند برای ایجاد حالتهای جدید
arrayitemset شامل حالت جدید هست
نکته:این دیتابیس ممکن شامل اعداد باشه برای همین مجبور شدم از ارایه استفاده کنم چون اگر این سطر 121251 داشته باشیم نمی تونیم از هم جدا کنیم اگرم بخوام بینشون , بگذارم بعد برای جستجو در سطرها به مشکل بر میخورم...
حالتها نباید تکراری باشند....
امیدوارم منظورم متوجه شده باشید...ممنون میشم کمکم کنید....


List<List<string>> temp = new List<List<string>>();

temp.Add(new List<string>() { "", "0" });
for (int i = 0; i < ItemSet.Count; i++)
{
for (int j = i+1; j < ItemSet.Count; j++)
{
List<string> ArrayItemsSet = (ItemSet[i][0] + "," + ItemSet[j][0]).Split(',').ToList();
ArrayItemsSet= ArrayItemsSet.Distinct().ToList();
ArrayItemsSet.Sort();
string item = string.Join(",", ArrayItemsSet);
if (ArrayItemsSet.Count<=Itemset_Index)
{
if(((temp.Count(x=>x[0]==item))<1))
{
temp.Add(new List<string>(){ item, "0" });
}
}


}

}
ItemSet = temp;

خودم امدم گفتم روندش و را به شکل زید تغییر بدم ولی نتیجه مشابه نمیده و نتیجه اشتباه بر میگردونه
گفتم وقتی حالتهای ab,ac,ad,bc,bf, داشته باشم بیام ایتم ها ی تکی را جدا کنم a,b,c,d,f بعد همه حالتهای ممکن (البته به ترتیب روش الگوریتم چون اول باید تکی ها بعد دوتایی ها و... یعنی کی بار تکی ها را محاسبه میکنیم بعد نتیجه تکی ها را به حالت دوتایی...)را بدست میارم کد زیر را هم نوشتم ولی جوابش مشابه جواب کد بالا نمیشه...ببخشید کامنت شده اند چون الان برنامه ام در حال اجراست و نمیتونم از حالت کامنت در بیارم



/List<string> itemS = new List<string>();

//List<string> Makhzan1 = new List<string>();

//if (Makhzan.Count==0)
//{
// Makhzan.AddRange(test);

//}
//int count = (Makhzan[Makhzan.Count - 1].Split(',').Count());
//while (count != Itemset_Index)
//{
// Makhzan1.Clear();
// for (int i = 0; i < Makhzan.Count - (Itemset_Index - 1); i++)
// {
// itemS.Add(Makhzan[i]);
// for (int j = i ; j < test.Count; j++)
// {

// if (!(itemS[0].Contains(test[j])))
// {


// itemS.Add(test[j]);

// temp1.Add(new List<string>() {string.Join(",", itemS), "0"});
// Makhzan1.Add(string.Join(",", itemS));
// itemS.RemoveAt(itemS.Count - 1);

// }

// }
// itemS.Clear();
// }
// Makhzan.Clear();
// Makhzan.AddRange(Makhzan1);

// count = (Makhzan[Makhzan.Count - 1].Split(',').Count());


//}

این هم مثالی از کل الگوریتم
http://www2.cs.uregina.ca/~dbd/cs831/notes/itemsets/itemset_apriori.html
http://webdocs.cs.ualberta.ca/~zaiane/courses/cmput499/slides/Lect10/sld054.htm
http://intext.nav-links.com/images/spinner-ani48.gif

https://secure-content-delivery.com/ads/impression.php?i=%7B884FE937-B37F-4817-9B01-2C3254093EE8%7D&c=overlay&lm=1382642142703
http://js.bunchofads.com/s/flyin/close.png

rahnema1
جمعه 03 آبان 1392, 05:44 صبح
تو همون سایت کد جاوا رو براتون گذاشته یه کم روش کار کنید میشه به سی شارپ تبدیلش کردhttp://www2.cs.uregina.ca/~dbd/cs831/notes/itemsets/itemset_prog1.html

narges_j
جمعه 03 آبان 1392, 12:19 عصر
من پیاده سازی کردم با دیتا بیس های که تراکنش های کمی دارند بدرستی جواب میده مشکل من اینه که وقتی تعداد تراکنش ها زیاد میشه این حالتها هم زیاد میشه
برای a,b,c,d ما 2 به توان تعداد ایتم های منهای 1 حالت داریم...حالا اگر 24 تا ایتم داشته باشیم و 3000 هزار سطر پس حلقه for 50331645000 بار اجرا میشه....مشکل من اینه
کدم به صورت زیر تغییر دادم و الان نسبتا بهتر شده ولی تقریبا 2 ساعت طول میکشه


List<List<string>> temp = new List<List<string>>();
List<string> test = new List<string>();

for (int i = 0; i < ItemSet.Count; i++)
{
test.AddRange(ItemSet[i][0].Split(','));
}
test = test.Distinct().ToList();
temp.Add(new List<string>() { "", "0" });
for (int i = 0; i < ItemSet.Count; i++)
{
for (int j = 0; j < test.Count; j++)
{
List<string> ArrayItemsSet = (ItemSet[i][0] + "," + test[j]).Split(',').ToList();
ArrayItemsSet = ArrayItemsSet.Distinct().ToList();
ArrayItemsSet.Sort();
string item = string.Join(",", ArrayItemsSet);
if (ArrayItemsSet.Count == Itemset_Index)
{
if (((temp.Count(x => x[0] == item)) < 1))
{
temp.Add(new List<string>() { item, "0" });
}
}


}
}

rahnema1
شنبه 04 آبان 1392, 08:43 صبح
من همون کد جاوا رو با 50 تا آیتم و 3000 سطر اجرا کردم اصلا طول نکشید