当前位置: 首页 > 知识库问答 >
问题:

在已排序的日志中查找“重要”条目

张照
2023-03-14

我有一个由几千个整数组成的日志文件,每个整数被分成一行。我已经把它解析成一个这样的整数数组,也进行了排序。现在我的问题变成了从这个日志中找到“重要”整数——这些整数显示了一些用户可配置的时间。

例如,给定日志,用户可以过滤到只看到出现一定缩放次数的条目。

目前我正在扫描整个数组,并记录每个条目出现的次数。肯定有更好的方法吗?

共有2个答案

严欣怡
2023-03-14

您的排序可能需要O(NlogN)时间。是否需要对同一数据集进行多次(n/I)查询?

如果是,则遍历已排序的数组,生成(Value;Count)对,并按计数字段对它们进行排序。现在,您可以使用二进制搜索轻松地分离具有高计数的对

赏航
2023-03-14

首先,我需要注意,以下只是一个理论解决方案,您可能应该使用@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。这可能会更改,因此只是<