我正在编写一些扩展来模仿地图并减少Lisp中的函数.
public delegate R ReduceFunction<T,R>(T t, R previous);
public delegate void TransformFunction<T>(T t, params object[] args);
public static R Reduce<T,R>(this List<T> list, ReduceFunction<T,R> r, R initial)
{
var aggregate = initial;
foreach(var t in list)
aggregate = r(t,aggregate);
return aggregate;
}
public static void Transform<T>(this List<T> list, TransformFunction<T> f, params object [] args)
{
foreach(var t in list)
f(t,args);
}
Run Code Online (Sandbox Code Playgroud)
转换功能将减少如下:
foreach(var t in list)
if(conditions && moreconditions)
//do work etc
Run Code Online (Sandbox Code Playgroud)
这有意义吗?会更好吗?
我们的服务器生成{c521c143-2a23-42ef-89d1-557915e2323a}-sign.xml
日志文件夹中的文件.第一部分是GUID; 第二部分是名称模板.
我想计算具有相同名称模板的文件数.例如,我们有
{c521c143-2a23-42ef-89d1-557915e2323a}-sign.xml
{aa3718d1-98e2-4559-bab0-1c69f04eb7ec}-hero.xml
{0c7a50dc-972e-4062-a60c-062a51c7b32c}-sign.xml
Run Code Online (Sandbox Code Playgroud)
结果应该是
sign.xml,2
hero.xml,1
Run Code Online (Sandbox Code Playgroud)
可能的名称模板的总种类是未知的,可能超过int.MaxValue
.
服务器上的文件总数未知,可能超过int.MaxValue
.
要求:
最终结果应按名称模板排序.
该工具将运行的服务器是超级关键的.在运行工具之前,我们应该能够告诉内存使用情况(MB)和生成的临时文件数(如果有),并且不知道日志文件夹的任何特征.
我们使用C#语言.
我的想法:
Group1.txt
.Group2.txt
.然后我合并所有这些组文件.
Group1.txt Group2.txt Group3.txt Group4.txt
\ / \ /
Group1-2.txt Group3-4.txt
\ /
Group1-4.txt
Run Code Online (Sandbox Code Playgroud)
Group1-4.txt
是最后的结果.
我和我朋友之间的分歧是我们如何计算事件的数量.
我建议使用字典.文件名模板是关键.设m为分区大小.(在这个例子中它是5000.)然后时间复杂度O(m),空间复杂度O(m).
我的朋友建议对名称模板进行排序,然后在一次传递中对事件进行计数,因为相同的名称模板现在都在一起.时间复杂度O(m log m),空间复杂度O(m).
我们无法说服对方.你们看到这两种方法有什么问题吗?