怎樣改進算法,提高程式的性能?

简叔 2003-10-18 04:08:00
下面是我求 WinForm DataGrid 中某一個 Column 中值的眾數,但是資料筆數多時下面的程式就非常的慢,請高手指點,改進一下算法:

public string GetMode(System.Windows.Forms.DataGrid dataGrid)
{
System.Data.DataSet dataSet = (System.Data.DataSet)dataGrid.DataSource;
System.Data.DataTable dataTable = dataSet.Tables[dataGrid.DataMember];
System.Collections.SortedList sortedList = new SortedList();
int columnIndex = dataGrid.CurrentCell.ColumnNumber;
for (int i=0;i<dataTable.Rows.Count;i++)
{
string cellText = dataTable.Rows[i].ItemArray[columnIndex].ToString();
if (sortedList.Count == 0)
{
sortedList.Add(cellText,1);
}
else
{
for(int j=0; j<sortedList.Count;j++)
{
if (sortedList.GetKey(j).ToString() == cellText)
{
sortedList.SetByIndex(j,(object)((int)sortedList.GetByIndex(j)+1));
}
else
{
//sortedList.Add(cellText,0);

try
{
sortedList.Add(cellText,0);
}
catch(Exception e)
{
/* 類型 'System.ArgumentException' 的未處理例外狀況發生於 mscorlib.dll
* 其他資訊: 已經加入項目。字典中的索引鍵: "E" 加入的索引鍵: "E"
*
*/
}
}
}
}
}
int val = (int)sortedList.GetByIndex(0);
string key = (string)sortedList.GetKey(0);
for(int i = 1; i<sortedList.Count; i++)
{
if ((int)sortedList.GetByIndex(i) > val)
{
key = (string)sortedList.GetKey(i);
}

}
return key;
}
...全文
125 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
简叔 2003-10-21
  • 打赏
  • 举报
回复
好啊!我還真有一臺正閒著如果不嫌棄(thinkpad)的話,下次遇到你就送給你好了.

"在程序運行時分散的求眾數" 有點兒意思? 能講講作法嗎? 我是在 end-user 資料查詢出來後對其結果作統計,如果要是到後臺再挑一次,組合 SQL 就夠麻煩的了!
geniusoft 2003-10-20
  • 打赏
  • 举报
回复
你这样求众数性能是非常低的,仅sortedList的性能就够受的了。
可以用sql 语句在数据库中由数据库计算,或者把求的过程分散:-)就是在程序运行时分散地求众数。

我们程序中有一个地方有用到“最常用”这个众数,就是采用第二种方法。性能没有什么影响喔:-)
http://3028290.126.com

ps:本人解答问题要收费的。下回逮住你让你送我一台笔记本算了。
简叔 2003-10-20
  • 打赏
  • 举报
回复
程式碼是有點長 :)不用看程式碼了,看我最後的說明就可以了.
eyoexply 2003-10-18
  • 打赏
  • 举报
回复
太长了 我是菜鸟 知道看了也看不懂 所以不看了
简叔 2003-10-18
  • 打赏
  • 举报
回复
眾數就是在一組記錄中出現次數最多的那個值. 如 int[] num = {1,1,2,3,4,5,6} 眾數就是 1.

謝謝 Bengnangua 的 解答,我順便講一下我現在的作法和需求.

現在是對 DataGrid 中的某一個 Column 的資料進行統計求眾數.我的作法是 Loop DataGrid中所有的 Row 把這個 Column 的值作為 SortedList 的 Key Value 就是這個值出現在次數了,最後從 SortedList 上得出 Value 最大的那一項的 Key 就是我所求的眾數.
可是這樣程式的效能就不高--
1) 把 DataGrid 的資料一列一列讀到 SortedList 中

2) 在把資料加到 sortedList 中的同時又要 Loop 現在的 sortedList 判斷 sortedList 中是否已有這個值,有的話就把其 value 加一, 因為 sortedList 中存的是 object,這其中就又有 boxing 和 unboxing 的動作

3) Loop sortedList 找出 value 最大的那一項的 Key

daou101 2003-10-18
  • 打赏
  • 举报
回复
gz
Bengnangua 2003-10-18
  • 打赏
  • 举报
回复
public string GetMode(System.Windows.Forms.DataGrid dataGrid)
{
System.Data.DataSet dataSet = (System.Data.DataSet)dataGrid.DataSource;
System.Data.DataTable dataTable = dataSet.Tables[dataGrid.DataMember];
System.Collections.SortedList sortedList = new SortedList();
int columnIndex = dataGrid.CurrentCell.ColumnNumber;
for (int i=0;i<dataTable.Rows.Count;i++)
{
string cellText = dataTable.Rows[i].ItemArray[columnIndex].ToString();
if (sortedList.Count == 0)
{
sortedList.Add(cellText,1);

}
else
{
for(int j=0; j<sortedList.Count;j++)
{
if (sortedList.GetKey(j).ToString() == cellText)
{
sortedList.SetByIndex(j,(object)((int)sortedList.GetByIndex(j)+1));
//!!!!!!!!从这条语句看, 好象你要对某个字短的数值进行统计 , 建议用 Sql 中 的 selecrt [分组名], count(*) as num group by 进行分组 这样这个循环就每必要了
}
else
{
//sortedList.Add(cellText,0);

try
{
sortedList.Add(cellText,0);
}
catch(Exception e)
{
/* 類型 'System.ArgumentException' 的未處理例外狀況發生於 mscorlib.dll
* 其他資訊: 已經加入項目。字典中的索引鍵: "E" 加入的索引鍵: "E"
*
*/
}
}
}
}
}
int val = (int)sortedList.GetByIndex(0);
string key = (string)sortedList.GetKey(0);
/* !!!!!!!后面的要吧前面的覆盖, 那就用从后向前查
for(int i = 1; i<sortedList.Count; i++)
{
if ((int)sortedList.GetByIndex(i) > val)
{
key = (string)sortedList.GetKey(i);
}

}
*/
for (int i=sortedList.Count ;i>0;i--)
{
if ((int)sortedList.GetByIndex(i) > val)
{
key = (string)sortedList.GetKey(i);
break;
}
}
return key;
}
希望有所帮助:)

110,525

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧