用c#构造树算法的最佳方法
本文关键字:最佳 方法 算法 | 更新日期: 2023-09-27 18:04:41
我在找到最有效的解决方案时遇到了一个小问题。我有一个学生id 的数字,例如10。其中一些id彼此是相对的(兄弟姐妹)。如果是兄弟姐妹,只留下其中一个来辨认,不管是哪一个,第一个就可以了。
例如,学生id
- 原来
,其中1, 2, 3
是一个家庭兄弟姐妹,8, 9
是另一个家庭兄弟姐妹。最后应该是:
- 预计
- 1
, 4, 5, 6, 7, 8 , 10
我是通过循环来做的。
更新:
我只是停下来实现它,因为它变得越来越大。这是我脑海中的一个大画面。我只是逐行收集每个给定id的所有兄弟id,然后对每个id进行迭代。但就像我说的,这是浪费时间。
-
代码(概念)
static string Trimsiblings(string ppl) { string[] pids=ppl.Split(','); Stack<string> personid=new Stack<string>(); foreach(string pid in pids) { // access database and check for all sibling // is for each individual pid // such as in example above // row 1: field 1=1, field2=2, field3=3 // row 2: field 1=8, field2=9 query = Select..where ..id = pid; // this line is pesudo code for(int i=0; i<query.Length; i++) { foreach(string pid in pids) { if(query.field1==pid) { personid.Push(pid);
} } } } }
对于高效的代码,必须注意每个兄弟姐妹家族的一个成员(例如,第一个)是不相关的,因为它将留在输出中。也就是说,我们只需要
- 创建一个不能出现在输出 中的项目列表
- 实际上删除它们
当然,这只在每个兄弟结点实际出现在原始id列表中的假设下才有效。
在代码:int[] ids = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int families = new int[2][] {
new int [] {1, 2, 3},
new int [] {8, 9}
};
var itemsToOmit = siblings.
Select(family => family.Skip(1)).
Aggregate((family1, family2) => family1.Concat(family2));
var cleanedIds = ids.Except(itemsToOmit);
编辑:既然你提到你不太熟悉语法,我将给一些进一步的解释
- 我使用的表达式是扩展方法,是系统的一部分。LINQ命名空间
- 选择方法将一个序列转换为另一个序列。由于
families
是序列的序列,family
将是同一家族中的兄弟姐妹序列(即1, 2, 3
和8, 9
) - Skip方法跳过序列中的一些元素。在这里,我决定总是跳过第一个元素(原因,见上文)
- Aggregate方法将序列中的元素组合成单个元素。这里,所有家庭的兄弟姐妹只是相互连接(除了每个家庭的第一个兄弟姐妹,通过Skip省略了) Except方法返回作为参数给出的序列中而不是的所有元素。
如何
public static String Trimsiblings(String ppl) {
var table=GetSiblingTable();
var pids=ppl.Split(',');
return
String.Join(", ", (
from id in pids.Select(x => int.Parse(x))
where (
from row in table.AsEnumerable()
select
from DataColumn column in table.Columns
let data=row[column.ColumnName]
where DBNull.Value!=data
select int.Parse((String)data)
).All(x => false==x.Contains(id)||x.First()==id)
select id.ToString()).ToArray()
);
}
// emulation of getting table from database
public static DataTable GetSiblingTable() {
var dt=new DataTable();
// define field1, ..., fieldn
for(int n=3, i=1+n; i-->1; dt.Columns.Add("field"+i))
;
dt.Rows.Add(new object[] { 1, 2, 3 });
dt.Rows.Add(new object[] { 8, 9 });
return dt;
}
public static void TestMethod() {
Console.WriteLine("{0}", Trimsiblings("1, 2, 3, 4, 5, 6, 7, 8, 9, 10"));
}
注释请求为什么(如果你需要)。