- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个非常有趣的(至少对我而言)问题要解决(而且,不,这不是家庭作业)。它等同于:您需要确定用户在他的计算机前进行的“ session ”和“ session 开始和结束时间”。
您将获得进行任何用户交互的时间和最长不活动时间。如果两个用户输入之间耗时大于或等于不活动时间,则它们是不同 session 的一部分。
基本上我得到的输入是这样的(输入没有排序,我宁愿在确定 session 之前不对它们进行排序):
06:38
07:12
06:17
09:00
06:49
07:37
08:45
09:51
08:29
然后,比如说,有 30 分钟的不活动时间。
然后我需要找到三个 session :
[06:17...07:12]
[07:37...09:00]
[09:51...09:51]
如果不活动时间设置为 12 小时,那么我只会找到一个大 session :
[06:17...09:51]
我怎样才能简单地解决这个问题?
有一个最短的不活动有效时间,大约为 15 分钟。
我宁愿不预先排序的原因是我会得到很多数据并且只将它们存储在内存中是有问题的。但是,这些数据中的大部分应该是相同 session 的一部分(与数据量相比, session 应该相对较少,可能是几千比一 [每个 session 数千个用户输入])。
到目前为止,我正在考虑读取输入(比如 06:38)并定义一个区间 [data-max_inactivity...data+max_inactivity],并且对于每个新输入,使用二分法 (log n) 搜索以查看它是否落在已知区间内或创建新区间。
我会为每个输入重复这个,使解决方案 n log n AFAICT。此外,好处是它不会使用太多内存,因为它只会创建间隔(并且大多数输入将落在已知间隔内)。
此外,每次如果落在已知区间内,我都必须更改区间的下限或上限,然后查看是否需要与下一个区间“合并”。例如(最长不活动时间为 30 分钟):
[06:00...07:00] (because I got 06:30)
[06:00...07:00][07:45...08:45] (because I later got 08:15)
[06:00...08:45] (because I just received 07:20)
我不知道描述的是否很清楚,但这就是我需要做的。
这样的问题有名字吗?你会如何解决它?
编辑
如果我打算按我计划的方式解决它,我很想知道我应该使用哪种数据结构。我需要 log n 搜索和插入/合并能力。
最佳答案
最大延迟
如果日志条目有“最大延迟”(例如,最大延迟为 2 小时,8:12 的事件将永远不会在 10:12 的事件之后列出),您可以向前看并排序。
进行排序
或者,我会先尝试排序——至少要确保它不起作用。时间戳可以合理地存储在 8 个字节中(即使出于您的目的,您也可以将 2.5 亿放入 1 GB 中)。快速排序可能不是这里的最佳选择,因为它的局部性较低,插入排序对于几乎已排序的数据几乎是完美的(尽管它的局部性也很差),或者,按 block 快速排序,然后通过合并合并 block sort 应该可以,即使它会增加内存需求。
压扁并征服
或者,您可以使用以下策略:
如果您的日志文件具有您的问题所暗示的那种“时间局部性”,那么单次通过就应该减少数据以允许“完整”排序。
[编辑] [本站] 1演示了一个“优化后的插入排序完成的快速排序”,它在几乎排序的数据上非常好。就像这些人一样 std::sort
关于算法问题 : determining "user sessions",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3387274/
我很难找到正确的搜索语法:) 作为作业的一部分,我正在为 Android 开发一个国际象棋游戏。 我想使用按钮。 我画了棋盘,可以选择一个按钮(即我要移动的棋子)。 我可以点击一 block (按钮)
我有两个类,一个依赖于硬件,一个不依赖于硬件(我们分别称它们为 HardwareDependent 和 HardwareIndependent)。硬件相关类扩展了硬件独立类。现在我有另一个类,它至少必
在这里得到一个 Hibernate MappingException,我不知道为什么。 这是我得到的错误: 2014/01/13 23:58:38 [] ERROR GrailsContextLoad
我想了解 RODBC 如何确定新创建的 (Access) 表的列类型? sqlSave 的 R 文档非常神秘:“类型是通过咨询参数 varTypes 和 typeInfo 来选择的”。并且没有这个论点
我有一个具有定义高度的 div,并且 overflow:scroll; 。它的内容太长,因此出现滚动条。 现在是发痒的部分。它的一些内部 HTML 总是奇怪地出现(准确地说,是 tableFilter
场景 某些 SQL 代理作业计划全天每隔几分钟运行一次。 在某些情况下,它会错过下一个计划,因为它仍在按照上一个计划运行。 每隔一段时间,作业可能会“挂起”。这不会产生失败(因为作业尚未停止)。发生这
目前我使用这个解决方案来加载资源: URL url = MyClass.class.getClassLoader().getResource("documents/"+path); if(url ==
我正在尝试使用nRoomAllocationId在房间传输和房间部门映射类上实现多对一和一对多双向映射。 房间转移类 @Entity @Table(name="roomtransfer") publi
我有一个来自类的 print 方法: public void print(EditorPanePrinter epp) { try { PrinterJob pj=Printe
确定文件所在目录的好方法是什么?我会使用 realpath(),但这会返回符号链接(symbolic link)指向的文件或目录的绝对路径。 例如,如果参数是文件的基名,并且 lstat() 返回 0
我有一个名为 account 的抽象类,如下所示 - abstract class Account { private int number; private String owner
我一直在编写一个打开 Firebird 数据库的小型 Python 应用程序。 为了实现此目标,我使用嵌入的 Firebird 2.5.7.27050,64 位。 尽管如此,无论何时我尝试使用 Pyt
我有一个非常有趣的(至少对我而言)问题要解决(而且,不,这不是家庭作业)。它等同于:您需要确定用户在他的计算机前进行的“ session ”和“ session 开始和结束时间”。 您将获得进行任何用
从 iOS8 开始,您需要注册并提示用户使用本地通知。因此,我想实现一种方法来仔细检查这些权限。 如何检查本地通知设置是否未确定/未设置?到目前为止,我只知道如何检查本地通知是否被granted 或d
在我的应用程序中,我使用 Google In-app Billing Version 3 API 实现应用内购买。在我的应用程序的日志中,我看到: D/Finsky (26024): [1204]
我的小部件有几个 ImageButtons,为它们设置 onClicked 事件,我使用 PendingIntent: Intent intent = new Intent(context, Upda
推送到 github 工作正常。我认为当我从 github checkout 一个分支时,这个问题就开始了。我该如何解决?当我现在尝试推送到 github 时,出现错误“无法确定当前分支。” 此外,我
我正在尝试使用表数据导入向导工具将一个 csv 文件导入到我的数据库中,导入到只有一个属性(它的 ID VARCHAR(10))的表中,导入失败并向我显示此错误:error我检查了 csv 文件以查找
我正在尝试将一些随机生成的数字“合并”在我之前拥有的值向量中的相邻值之间定义的间隔之间。所以基本上,我有以下几点: vectorA包含从 101 到 0 的 101 个值。 我生成一个名为 x 的随机
我要执行一个脚本file.R使用 Rscript .在 file.R ,我使用包dplyr . # file.R df outputFile.Rout 2>&1 但是,如果我添加 default-p
我是一名优秀的程序员,十分优秀!