使用 C/C++ 中的二叉搜索在日志文件中搜索日期时间
Search a datetime in a log file using Binary Search in C/C++
>我有一些日志文件是用log4cpp格式编写
的--根据log4cpp的性质,此文件按每行开头的日期时间排序
假设格式类似于
2012-09-02 17:17:36.891 This is line 1 in file 2
...
2013-08-05 14:17:35.344 This is line 607082 in file 2
2013-08-05 14:17:36.891 This is line 607083 in file 2
...
2013-09-05 14:27:36.891 This is line 934594 in file 2
现在我正在编写一个程序来解析这些文件并尝试快速找到一行。
例如,如果我运行
./my_program -start_time "2013-08-05 14:17:36" file_2.txt
我希望这个程序可以因此返回607083。
此外,-start_time可以基于其他粒度,如"2013-08-05 14:17:35.899"或"2013-08-15",但我期待最接近的结果。
我可以逐行遍历此文件,并比较每行开头的时间戳(只需使用字符串比较),但这需要 O(N) 时间。我已经实现了它,发现如果在开始时有数百万行要跳过,它真的很慢。
我想知道我们是否可以为此使用二叉搜索。我认为这是返回最接近结果的最佳方式,只需要 O(lgN) 时间
是的,你可以。这是按日期排序的日志。为什么不采取第一行和最后一行,这应该是最近和最后一个最近的日期。
您可以创建一个将日期转换为秒的函数。 在第一次调用中,转到日志的中间,检查您的日期是更大还是更小,依此类推......(二叉搜索)
希望这有所帮助,并希望我对这将如何工作的解释是清楚的
当你在Unix/Posix下运行时,你可以mmap()整个文件并在内存上运行(并避免lseek()和朋友)。
因此,您会得到一个"char *logbuffer = mmap(...)"指针,并且可以在那里执行二进制搜索。
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- 在C++中搜索嵌套多映射值
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 为什么二进制搜索在我的测试中不起作用
- 正在尝试重载二进制搜索树分配运算符
- c++binary_search函数排序数组(流行名称搜索)出现问题
- 向量上的线性搜索
- 如何在动态数组上使用搜索函数
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- cmake:添加要搜索头文件的目录
- 使用C++创建特殊的二叉搜索树
- 在C++的字符串中搜索和删除某些字符
- std::unordered_map 搜索算法是如何实现的?
- 使用不变量来确定二分搜索中的边界条件
- 二叉搜索如何比线性搜索更快?
- 按边长度递归搜索图中所有可行路径
- 使用 C/C++ 中的二叉搜索在日志文件中搜索日期时间
- 在巨大的日志文件中搜索数百种模式