PDA

View Full Version : لطفا این پکیج رو چند باراجرا بفرمایید و ببینید همه موارد خروجی یکسانه!؟



jlover
چهارشنبه 07 بهمن 1388, 23:04 عصر
پکیج محاسبه ی اول بودن یک عدد هست که در سه کلاس که سه الگوریتم متفاوت دارند + یک کلاس تست طبقه بندی شده در ذیل کلاس انتزاعی Prime
البته الگوریتم ها خیلی واضح و ابتدایی هستند(باید کلاس پیاده ساری کننده ی الگوریتم بازگشتی هم حتما اضافه بشه)

هدف من بیش از خود مسئله ی اعداد اول،محاسبه ی زمان اجرای متد ()isPrime
بوده و نتیجه ی مورد انتظار هم بدست میاد اما :
مثلا توی 10 بار اجرا بار مثلا هفتم و هشتم نتایج رو برعکس نشون میده !
خودم فکر میکنم به خاطر نوع نمونه سازی هر کلاس باشه

این موضوع اهمیتش برا من همون بحث هزینه ی الگوریتم هست و این مثال ابتدایی نشون میده که شاید چندان قابل اعتماد نباشه اینطور محاسبه ...

گرچه با اجرای برنامه فایلهای منبع ضمیمه شده توضیحاتی در خروجی میاد که بتونید درک کنید برنامه رو ،هرچند که خیلی ساده ست ، اما یه توضیح کوتاه به عنوان مستندات :
کلاس Prime1 از پرهزینه ترین الگوریتم استفاده میکنه و در Prime2 و Prime3 هر کدوم محدوده ی کار رو نسبت به قبلی نصف میکنه
در ضمن برای نمونه میتونید از این اعداد که همگی اول هستند استفاده کنید :
456899 و 456901 و 456979 و 456991
457001 و 457003 و 457013

من از 457001 استفاده کردم و نتایج - در اکثر اوقات به ترتیب برای کلاس 1،2،و3 به صورت زیر بود :
32 تقریبا
16 تقریبا
15 تقریبا

لطفا اجرا کنید و نتیجه رو بگید

ممنون

jlover
یک شنبه 11 بهمن 1388, 19:41 عصر
دوستان خوبم که بعید میدونم هیچ کدومتون کدها رو اجرا کرده باشین،چه برسه به بررسیشون

مسئله حل شد

فکر کردم شاید یه روزی ، یه بنده خدایی ، به موضوع بهینه گی الگوریتم ها و چگونگی تست اونها علاقه مند باشه و گذرش به اینجا بیفته،بنابراین تجربه م رو در اختیارش میگذارم :

موضوع اینه که وقتی از نمونه ی خیلی بزرگ(یا به اندازه ی کافی بزرگ)ی استفاده بشه برای تست،نتایج هم در تمام خروجی ها مطابق انتظار خواهد بود
برای مثال عدد 15,485,863 رو در مورد این برنامه به کار گرفتم و شاید نزدیک به 50 بار اجرا کردم،و نتایج همیشه یک شکل بود : برای الگوریتم اول حدود 1 ثانیه و برای دومی و سومی حدود نیم ثانیه

یه برنامه ی دیگه ای بود-مرتب سازی حبابی-اونو هم با دو الگوریتم که تفاوت ریزی با هم داشتند،امتحان کردم ، منتها یه بار با 2000 عدد،که مثل همون مثال اعداد اول قاتی میکرد،اما برای 10000 عدد،دقیقا اختلاف زمان محاسبه در دو متد متفاوت رو نشون میداد :


public class TestSorts {

private final static int COUNT = 10000 ; // the number of slots in array(arry length)
private int[] makeArray (int n){
int[] numbers = new int[n];
for (int i=0; i<n; i++)
numbers[i] = (int)(Math.random()*n*2) ;
return numbers;
}

/**
* bubbleSort() sorts the values in arr into ascending order
* Pre: arr is not null.
* Post: The values arr[0]...arr[arr.length-1] will be
* arranged in ascending order.
*/
private void bubbleSort(int arr[]) {
int temp; // Temporary variable for swap
for (int pass = 1; pass < arr.length; pass++) // For each pass
for (int pair = 1; pair < arr.length; pair++) // For each pair
if (arr[pair-1] > arr[pair]) { // Compare
temp = arr[pair-1]; // and swap
arr[pair-1] = arr[pair];
arr[pair] = temp;
} // if
} // bubbleSort()

private void editedBubbleSort (int arr[]) {
int temp; // Temporary variable for swap
for (int pass = 0; pass < arr.length; pass++) // For each pass
for (int pair = 1; pair < arr.length-pass; pair++) // For each pair
if (arr[pair-1] > arr[pair]) { // Compare
temp = arr[pair-1]; // and swap
arr[pair-1] = arr[pair];
arr[pair] = temp;
} // if
}

/**
* print() prints the values in an array
* @param arr -- an array of integers
*/
public void print(int arr[]) {
for (int k = 0; k < arr.length; k++) // For each integer
System.out.print( arr[k] + " \t "); // Print it
System.out.println();
} // print()

/**
* main() creates a Sort object and uses it to sort an array
* of integers
*/
public static void main(String args[]) {
long start,end;
TestSorts sorter = new TestSorts();
int[] intArr = sorter.makeArray(COUNT);
// sorter.print(intArr);
int[] intArr2 = new int[COUNT];
for (int k=0; k<intArr2.length; k++)
intArr2[k]=intArr[k];
start = System.currentTimeMillis();
sorter.bubbleSort(intArr);
end = System.currentTimeMillis();
System.out.println("the original took "+(end-start)+" milliseconds to complete");
//sorter.print(intArr);
//System.out.println("the edited :");
start = System.currentTimeMillis();
sorter.editedBubbleSort(intArr2);
end = System.currentTimeMillis();
System.out.println("the editted took "+(end-start)+" milliseconds to complete");
//sorter.print(intArr2);
} // main()
} //Sort