Problem#3OK ni nak balas pantun amry..
Setelah dienhancekan/difixkan sebegitu jitu (chewahh) dan pelbagai pandangan dan diskusi telah diadakan dengan amry melalui YM, ini dia result yg diperoleh...
Test asal utk
Problem 3 MathChallenge.net adalah dgn menggunakan data
317584931803. Tapi utk memanjangkan lagi masa processing, aku pakai data sendiri iaitu
889338121.
Data yg sama telah dijalankan oleh amry dengan menggunakan algorithmnya yg telah difinetunekan bayekkknye!
Berikut adalah hasil test cases yg telah dijalankan dgn algorithm aku atas dual core notebook amry yg berdedssssuuuutt laju itu
Using LPFQueue
Using LPFQueueTest Data: 889338121
Answer: 7 127048303
Time taken: 00:00:15.6263927 ms
Using Arraylist
Using ArraylistTest Data: 889338121
Answer: 7 127048303
Time taken: 00:00:15.6565636 ms
Using Generic List
Using Generic ListTest Data: 889338121
Answer: 7 127048303
Time taken: 00:00:15.6969279 ms
Using Generic Queue
Using Generic QueueTest Data: 889338121
Answer: 7 127048303
Time taken: 00:00:15.7983956 ms
Aku tambah lagi 3 set of collection class utk buat berbandingan. Tapi disebabkan terlalu panjang, so aku amik ArrayList dan GenericQueue sahaja. Setelah test kat machine aku dan ofc aku, terbukti ArrayList remains the top contender. In most test cases, arraylist will be either on top or second in terms of performance. Aku hanya test semasa result disavekan ke dalam collection masing2. Dalam kes ni, queue memanggil method Enqueue(object) utk save data manakala ArrayList memangil Add(object) utk tujuan yg sama.
CODE
static void Main( string[] args )
{
string text = string.Empty;
string typeInput = string.Empty;
ulong value = 0;
Console.WriteLine( "Select Data Structure to use");
Console.WriteLine( "Q/q - Queue" );
Console.WriteLine( "GQ/gq - Generic Queue" );
Console.WriteLine( "AR/ar - ArrayList" );
Console.WriteLine( "GL/gl - Generic List" );
typeInput = Console.ReadLine();
LargestPrimeFactorBase lpfbase = GetDataStructureType( typeInput, out text );
if ( lpfbase == null )
{
Console.WriteLine( "Unknown type, aborting" );
return;
}
Console.WriteLine( "Enter value: (enter T1 or t1 for test data 1. Or T2/t2 for test data 2)" );
Console.Write( ">>" );
string temp = Console.ReadLine();
Stopwatch timer = new Stopwatch();
if ( ulong.TryParse( temp, out value ) )
{
Console.WriteLine();
Console.WriteLine( text );
}
else
{
if ( temp.ToUpper() == "T1" )
value = 13195;
if (temp.ToUpper() == "T2")
value = 317584931803;
}
timer.Start();
lpfbase.Process( value );
timer.Stop();
Console.Write( text );
Console.WriteLine( "Test Data: {0}", value );
Console.WriteLine( "Answer: {0}", lpfbase.List);
Console.WriteLine( "Time taken: {0} ms", timer.Elapsed );
}
internal static LargestPrimeFactorBase GetDataStructureType(string type, out string text)
{
text = string.Empty;
if ( type.ToUpper() == "Q")
{
text = "Using LPFQueue";
return new LPFQueue();
}
if ( type.ToUpper() == "GQ")
{
text = "Using Generic Queue";
return new LPFGenericQueue();
}
if ( type.ToUpper() == "AR")
{
text = "Using Arraylist";
return new LPFArrayList();
}
if ( type.ToUpper() == "GL" )
{
text = "Using Generic List";
return new LPFGenericList();
}
return null;
}
Code utk ArrayList
CODE
public class LPFArrayList : LargestPrimeFactorBase
{
private ArrayList m_list;
private ulong m_answer = 1;
public LPFArrayList()
{
}
public override void Process( ulong value )
{
m_list = new ArrayList();
for ( ulong i = 2; i < value; i++ )
{
if ( value % i == 0 && i % 2 > 0 )
{
m_answer *= i;
if ( m_answer > value )
break;
if ( ( i < 10 ) || ( i % 5 > 0 ) )
{
m_list.Add( i );
}
}
}
base.Process( value );
}
public override object Answer
{
get
{
return m_answer;
}
}
public override string List
{
get
{
string list = string.Empty;
IEnumerator enumerator = m_list.GetEnumerator();
while ( enumerator.MoveNext() )
{
list += " " + enumerator.Current;
}
return list;
}
}
}
code utk LPFGenericQueue, tukar yg berikut sahaja...
CODE
public override void Process( ulong value )
{
m_queue = new Queue<ulong>();
for ( ulong i = 2; i < value; i++ )
{
if ( value % i == 0 && i % 2 > 0 )
{
m_answer *= i;
if ( m_answer > value )
break;
if ( ( i < 10 ) || ( i % 5 > 0 ) )
{
m_queue.Enqueue( i );
}
}
}
base.Process( value );
public override string List
{
get
{
string list = string.Empty;
IEnumerator enumerator = m_queue.GetEnumerator();
while ( enumerator.MoveNext() )
{
list += " " + enumerator.Current;
}
return list;
}
}