2015-10-03 77 views
0

這個控制檯應用程序有點奇怪,但有點有趣,如果它有效。首先,我計算了填充LinkedList4.000.000元素所需的時間,其中隨機數字爲。然後,我在搜索LinkedList中的100個隨機元素。在這之間我寫出了填充和查找元素的時間。記錄填充LinkedList和Array的時間

之後,我試圖再次做同樣的事情,但與Array。先填充它,然後尋找100個隨機元素。然後,我正在排序array,查看在未排序的012排序的array中查找100個隨機元素的區別。然後再輸入時間。

問題是,在填充LinkedList並找到LinkedList中的元素後,我開始用循環填充數組。我得到一個無限循環。我真的不知道ATM有什麼問題。

我建議,如果你想幫忙,你複製我粘貼到這個問題的代碼,所以你瞭解它應該如何查找程序的所有部分。

代碼:

public static bool sokning(int[] a, int b) 
    { 
     bool sant = false; 
     Random rand = new Random(); 
     Stopwatch watchFindArray = new Stopwatch(); 
     Console.Write("Letar efter tal: "); 
     watchFindArray.Start(); 
     int myint = 0; 

     for (int iii = 0; iii < a.Length; iii++) 
     { 
      b = rand.Next(); 
      Console.Write("#"); 
      myint = Array.BinarySearch(a, b); 

      if (myint < 0) 
      { 
       sant = false; 
      } 
      else 
      { 
       sant = true; 
      } 
     } 
     watchFindArray.Stop(); 

     if (sant == true) 
     { 
      Console.WriteLine("\nFann alla element efter " + watchFindArray.Elapsed.TotalSeconds + " sekunder."); 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public static void körMetod() 
    { 
     const int MAX = 40000000; 
     int[] array = new int[MAX]; 
     int hittamig2 = 0; 
     Random rand2 = new Random(); 

     Stopwatch watchArray = new Stopwatch(); 
     Console.WriteLine("\nStartar Array..."); 
     watchArray.Start(); 
     Console.Write("Position: "); 
     for (int ii = 0; ii < MAX; ii++) 
     { 
      array[ii] = rand2.Next(); 
      if (array.Length % 1000000 == 0) 
      { 
       Console.Write("#"); 
      } 
     } 
     watchArray.Stop(); 
     Console.WriteLine("\nTid: " + watchArray.Elapsed.TotalSeconds + " sekunder att fylla en array."); 
     Console.WriteLine("Letar efter tal: "); 
     bool sant = sokning(array, hittamig2); 


     Console.WriteLine("Sorterar arrayen."); 
     Array.Sort(array); 
     sant = sokning(array, hittamig2); 

     if (sant == false) 
     { 
      Console.WriteLine("\nHittade inte alla element i arrayen."); 
      Console.ReadLine(); 
     } 
     else 
     { 
      Console.WriteLine("Klar!"); 
      Console.ReadLine(); 
     } 
    } 


    static void Main(string[] args) 
    { 
     Random rnd = new Random(); 
     const int MAX = 40000000; 
     LinkedList<int> lankadLista = new LinkedList<int>(); 
     Stopwatch watchLinkedList = new Stopwatch(); 
     Console.WriteLine("Startar LinkedList..."); 
     watchLinkedList.Start(); 
     Console.Write("Position: "); 
     for (int i = 0; i < MAX; i++) 
     { 
      lankadLista.AddLast(rnd.Next()); 
      if (lankadLista.Count() % 1000000 == 0) 
      { 
       Console.Write("#"); 
      } 
     } 
     watchLinkedList.Stop(); 
     Console.WriteLine("\nTid: " + watchLinkedList.Elapsed.TotalSeconds + " sekunder att fylla en LinkedList."); 
     Stopwatch watchFindLinkedList = new Stopwatch(); 
     int hittaMig; 
     Console.Write("Letar efter tal: "); 
     watchFindLinkedList.Start(); 
     for (int j = 0; j < 100; j++) 
     { 
      hittaMig = rnd.Next(); 
      Console.Write("#"); 
      lankadLista.Find(hittaMig); 
     } 
     watchFindLinkedList.Stop(); 
     Console.WriteLine("\nFann alla element efter " + 
     watchFindLinkedList.Elapsed.TotalSeconds + " sekunder."); 

     Console.ReadLine(); 

     körMetod(); 
    } 

問候。

+0

您是否嘗試調試它並瞭解爲什麼循環條件狀態不會更改? –

+0

是的,我試圖改變循環值。但奇怪的是,我爲LinkedList創建了相同的循環,並且工作... –

回答

2

你是不是在一個無限循環的問題是,它下面的代碼:

for (int ii = 0; ii < MAX; ii++) 
{ 
    array[ii] = rand2.Next(); 
    if (array.Length % 1000000 == 0) 
    { 
     Console.Write("#"); 
    } 
} 

內部條件是array.Length % 1000000 == 0它總是true因爲array大小始終是你初始化它:

const int MAX = 40000000; 
int[] array = new int[MAX]; 

當你在做array[ii] = rand2.Next();你不改變你只是設置一個數組的長度,其單元格的值等於rand2.Next();

這會導致Console.Write("#");在每個迭代中工作,並且也會顯着減慢循環。

爲了解決這個問題,只是改變:

if (array.Length % 1000000 == 0) 

到:

if (ii % 1000000 == 0) 

不想在陣列的每個末尾添加新項時間,因爲,調整數組大小每次都是超級sl重新分配數組ow,但你可以使用Array.Resize方法(沒有理由去做)

+0

使用LinkedList即時通訊使用方法.AddLast。有沒有像數組那樣的東西?有點卡住想法如何解決它。 –

+0

你不想那樣做,請閱讀我的編輯。 –

0

我覺得你在搜索數組的程序中遇到了很大的問題。 (sokning

哪裏是隻搜索100個元素的代碼?

看來你正在搜索一個隨機生成的數字爲4000萬次。只需修復Console.Write(「#」)以便在每百萬點正確寫入是不夠的。我認爲讓你覺得有一個無限循環的重大延遲是在你的代碼中搜索4千萬個數字中的4千萬個隨機生成的數字

當然這不是很「響應」(考慮此外您稱這種方法兩次)

public static bool sokning(int[] a, int b) 
{ 
    bool sant = false; 
    Random rand = new Random(); 
    Stopwatch watchFindArray = new Stopwatch(); 
    Console.Write("Letar efter tal: "); 
    watchFindArray.Start(); 
    int myint = 0; 

    // Search only 100 numbers like you do in the linked list 
    for (int iii = 0; iii < 100; iii++) 
    { 
     b = rand.Next(); 
     Console.Write("#"); 
     myint = Array.BinarySearch(a, b); 

     if (myint < 0) 
     { 
      sant = false; 
     } 
     else 
     { 
      sant = true; 
     } 
    } 
    watchFindArray.Stop(); 

    if (sant == true) 
    { 
     Console.WriteLine("\nFann alla element efter " + watchFindArray.Elapsed.TotalSeconds + " sekunder."); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

還有兩個小問題。

爲什麼在sokning方法內傳遞變量b?原始值從不使用,當您啓動循環搜索隨機生成的數字時,會覆蓋b變量os。所以我認爲你可以刪除它

第二個問題是這個sokning方法的結果。在每個循環中將sant變量設置爲true或false。所以最新的循環贏了。換句話說,如果最新的循環找到了匹配項,則返回true或false,如果不是。如果某個先前的循環有不同的結果,則對於sokning的呼叫者完全丟失。