新版代码地址:https://git.coding.net/clairewyd/wf.git
ptime运行结果:
瓶颈预测:
根据代码猜测瓶颈应该在排序算法上,猜测此处为瓶颈主要是因为程序采用的是hashtable来存储单词,之后要根据hash表中键所对应的值进行排序,将键和值分放在两个数组中,以相同的索引为媒介,之后要同时对两个数组进行操作,故而需要操作的数据很多,可能成为程序瓶颈。在编程初始时使用的是冒泡排序,后来考虑到效率问题程序改为使用排序算法中较快的快速排序算法,时间复杂度从O(n^2)提高到O(nlogn)。
排序算法片段:
/// <summary> /// 快速排序算法 /// </summary> /// <param name="valueArray">单词对应的词频数数组</param> /// <param name="keyArray">存放单词数组</param> /// <param name="v1">左索引</param> /// <param name="v2">右索引</param> private void QuickSort(int[] valueArray, string[] keyArray, int v1, int v2) { if (v1 < v2) { int index2 = Division(valueArray, keyArray, v1, v2); QuickSort(valueArray, keyArray, index2 + 1, v2); QuickSort(valueArray, keyArray, v1, index2 - 1); } } public int Division(int[] valueArray, string[] keyArray, int v1, int v2) { while (v1 < v2) { int num = valueArray[v1]; string num2 = keyArray[v1]; if (num < valueArray[v1 + 1]) { valueArray[v1] = valueArray[v1 + 1]; valueArray[v1 + 1] = num; keyArray[v1] = keyArray[v1 + 1]; keyArray[v1 + 1] = num2; v1++; } else { int temp = valueArray[v2]; valueArray[v2] = valueArray[v1 + 1]; valueArray[v1 + 1] = temp; string temp2 = keyArray[v2]; keyArray[v2] = keyArray[v1 + 1]; keyArray[v1 + 1] = temp2; v2--; } } //Console.WriteLine("----------\n"); return v1; }