我有一个由几千个整数组成的日志文件,每个整数被分成一行。我已经把它解析成一个这样的整数数组,也进行了排序。现在我的问题变成了从这个日志中找到“重要”整数——这些整数显示了一些用户可配置的时间。
例如,给定日志,用户可以过滤到只看到出现一定缩放次数的条目。
目前我正在扫描整个数组,并记录每个条目出现的次数。肯定有更好的方法吗?
您的排序可能需要O(NlogN)时间。是否需要对同一数据集进行多次(n/I)查询?
如果是,则遍历已排序的数组,生成(Value;Count)
对,并按计数
字段对它们进行排序。现在,您可以使用二进制搜索轻松地分离具有高计数的对
首先,我需要注意,以下只是一个理论解决方案,您可能应该使用@MBo提出的方法。
取排序数组的每个m=n/l
第2个元素。只有这些元素才是重要的,因为没有长度相同的元素序列m
可以在i*m
和(i 1)*m
之间匹配。
对于每个元素x
,用二进制搜索查找数组中的下界和上限。减去索引,可以知道计数,并决定保留或丢弃x
为不重要。
总的复杂性将是O((n/m)*logn)=O(l*logn)
。对于较大的m
,它可能(渐进地)优于O(n)
。然而,要在实践中获得改进,您需要非常具体的情况:
>
您可以访问O(1)
中数组的i
-th元素,而无需读取整个数组。否则,再次使用哈希表的计数排序。
假设您有一个由排序的固定宽度整数组成的文件“data.bin”
(也可以使用可变宽度,但需要一些额外的工作)。然后在伪代码中,算法可以是这样的:
def find_all_important(l, n):
m = n / l
for i = m to l step m:
x = read_integer_at_offset("data.bin", i)
lower_bound = find_lower_bound(x, 0, i)
upper_bound = find_upper_bound(x, i, n)
if upper_bound - lower_bound >= m:
report(x)
def find_lower_bound(x, begin, end):
if end - begin == 0:
return begin
mid = (end + begin) / 2
x = read_integer_at_offset("data.bin", mid)
if mid < x:
return find_lower_bound(x, mid + 1, end)
else:
return find_lower_bound(x, begin, mid)
据猜测,在现代硬件上,与naiveO(n)
相比,您不会获得任何明显的改进,除非您的文件非常大(数百MB)。当然,如果您的数据不能放入RAM中,这是可行的。但和优化一样,它可能值得测试。
我有一个由几千个整数组成的日志文件,每个整数都分开到一个新行上。我已经把它解析成一个这样的整数数组,也进行了排序。现在我的问题变成了从日志中找到“重要的”整数--这些整数显示了用户可配置的部分时间。 例如,给定日志,用户可以进行筛选,只看到出现一定比例次数的条目。 目前,我正在扫描整个数组,并计算每个条目出现的次数。肯定有更好的方法吧?
问题内容: 我正在开发一个通过Commons使用Log4J的项目。 我正在尝试找到日志文件的路径,但是没有找到合适的方法来从Logger返回日志文件的路径。 有人尝试过吗? 问题答案: 您必须 从根记录器 获取所有附加程序,然后获取日志文件的名称。
问题内容: 让我们 我想按日期和时间键对输出进行排序。 非常感谢你。 问题答案: 对于GNU排序: 按月份按第二列排序(这样,“三月”排在“四月”之前) 在数字模式下按第三列排序(因此,“ 9”位于“ 10”之前) 按第四列排序。 请参见手册中的更多详细信息。
我正在尝试根据买入或卖出方向对股票订单列表进行排序。 我试过这样的方法: 我看到下面的错误消息,我不清楚。 不兼容的类型。必需的int,但已将“comparing”推断给Comparator:不存在类型变量T,U的实例,因此Comparator符合Integer。
我是Elasticsearch的新手,如果我问的问题非常简单直接,我会道歉。 我使用以下学生教育细节的映射, 我的数据集中有近15000名学生。文件示例: 我的问题是,我正在尝试做一个简单的查询,以显示那些拥有“BE”学位的学生。但我希望目前拥有BE(工程学士)学位的学生的排名高于同样拥有硕士和博士学位的学生。 从我的例子中,如果我查询“BE”,学生3应该比学生2排名更高。我应该能够根据"endD
问题内容: SQL查找重复条目(在组内) 我有一个小问题,我不确定修复它的最佳方法是什么,因为我对数据库(Oracle)本身的访问有限。在我们的“ EVENT”表中,我们大约有16万个条目,每个EVENT都有一个GROUPID,而一个普通条目恰好有5行具有相同的GROUPID。由于一个错误,我们目前有几个重复的条目(重复,所以10行而不是5行,只是一个不同的EVENTID。这可能会更改,因此只是<