小编Wer*_*ann的帖子

如何在几百万的列表中找到1个或多个部分相交的时间间隔?

我需要一个有效的索引/搜索算法和/或数据结构的想法,用于确定时间间隔是否与列表中的零个或多个时间间隔重叠,请记住完全重叠是部分重叠的特殊情况.到目前为止,我还没有想出任何快速或优雅的东西......

考虑一组间隔,每个间隔有2个日期 - 开始和结束.

间隔可以是大的也可以是小的,它们可以部分地相互重叠,或者根本不重叠.在Java表示法中,类似这样:

interface Period 
{
  long getStart(); // millis since the epoch
  long getEnd();
  boolean intersects(Period p); // trivial intersection check with another period
}

Collection<Period> c = new ArrayList<Period>(); // assume a lot of elements
Run Code Online (Sandbox Code Playgroud)

目标是有效地找到与新到达的输入间隔部分相交的所有间隔.对于c作为ArrayList,这看起来像......

Collection<Period> getIntersectingPeriods(Period p)
{
  // how to implement this without full iteration?
  Collection<Period> result = new ArrayList<Period>();
  for (Period element : c)
    if (element.intersects(p))
      result.add(element);
  return result;
}
Run Code Online (Sandbox Code Playgroud)

在整个列表中线性迭代需要太多的比较来满足我的性能目标.而不是ArrayList,需要更好的方法来指导搜索,并最大限度地减少比较次数.

到目前为止,我最好的解决方案是在内部维护两个排序列表,并为每个请求进行4次二进制搜索和一些列表迭代.有更好的想法吗?


编者注:时间间隔是沿着单个轴使用线性段的特定情况,即X,或者在这种情况下,T(对于时间).

java algorithm data-structures

9
推荐指数
1
解决办法
1383
查看次数

圆形参考错误不正确

我们的团队多年来一直使用Delphi 6,然后在2006年转为Delphi.对于这两个版本,我们遇到以下问题:编译器经常抱怨一个据说递归使用的单元.这个单位是一个40k的LOC单位,是一个项目的核心,有近100万LOC(包括第三方).

错误消息不正确:项目的完整版本始终有效.不幸的是,错误消息并没有告诉我们所谓的循环引用的位置,只是该单元的名称.有时甚至会发生有效的错误消息列出2-4次,直到"找到"循环引用问题.显然编译器在这里运行一个圆圈.由于该项目的大小,很难手动找到问题.因此,我创建了一个工具,证明确实没有循环引用(该工具创建单元的有向依赖图并确定该图中的一致性组件 - 除非我故意放入一些,否则没有).

这不仅会影响F9编译,还会影响大部分时间都无法正常工作的代码完成/洞察力.有时当我第二次按下ctrl-space时它会起作用...

我们如何隔离甚至解决问题的任何想法?请注意,将40k LOC单元拆分成较小的单元是非常困难的,因为它包含大约15个在接口部分相互依赖的大类(我知道它很糟糕但无论如何都应该工作).

更新
我们不断进行重构,但这是重构的一个难点,因为一切都取决于一切,差不多.一直试图通过接口来解决它,但我们正在谈论一些具有100种方法和属性的类.它会慢一些.

升级到D2009可能是一个选择,但现在我们仍然坚持使用D2006(unicode的东西和价格标签是这里的两个塞子).问题是无论如何它会有所帮助,因为问题出现在那里,至少是D6.

关于修改使用条款,我们经常与Icarus一起做这件事.但到目前为止这没有任何帮助.我们现在在界面部分有90个自定义单位.但是,通过真正的循环引用,问题可能出在任何单位.还尝试将所有单元添加到dpr.

该项目与其他项目共享大量代码,并且有一些IFDEF.但是,定义不是在项目选项中设置的,而是通过公共包含文件设置的.因此,所有模块都应该看到相同的定义.此外,问题在完全重建后不久就会重新出现,而不会切换到另一个项目.

delphi

8
推荐指数
1
解决办法
946
查看次数

为什么Delphi无法推断参数TEnumerable <T>的类型?

请考虑以下Delphi 2010中的通用实用程序类声明:

TEnumerableUtils = class
public
  class function InferenceTest<T>(Param: T): T;
  class function Count<T>(Enumerable: TEnumerable<T>): Integer; overload;
  class function Count<T>(Enumerable: TEnumerable<T>; Filter: TPredicate<T>): Integer; overload;
end;
Run Code Online (Sandbox Code Playgroud)

不知何故,编译器类型推断似乎在这里有问题:

var
  I: Integer;
  L: TList<Integer>;
begin
  TEnumerableUtils.InferenceTest(I);  // no problem here
  TEnumerableUtils.Count(L);          // does not compile: E2250 There is no overloaded version of 'Count' that can be called with these arguments
  TEnumerableUtils.Count<Integer>(L); // compiles fine
end;
Run Code Online (Sandbox Code Playgroud)

第一个调用按预期工作,T正确推断为Integer.

第二个调用不起作用,除非我也添加<Integer> - 然后它可以工作,如第三次调用中所见.我做错了什么或Delphi中的类型推断只是不支持这个(我不认为它是Java中的一个问题,这也是为什么期望它在Delphi中工作).

delphi generics type-inference

5
推荐指数
1
解决办法
859
查看次数

如何在Windows(非Java)应用程序中使用Java时区ID?

我需要将时区信息添加到具有用户维护位置的db表中.数据将主要从Java代码访问,但也有一些PL/SQL和Win32(Delphi)代码需要了解时区信息.

似乎可以直接使用java.util.TimeZone中的id.Java很容易转换(很明显),Hibernate内置了对它的支持,显然Oracle也理解那些时区id:

select TZ_OFFSET('Pacific/Marquesas') from dual.
Run Code Online (Sandbox Code Playgroud)

问题是:时区ID似乎与Windows时区数据库不兼容.例如,java.util.timezone id"Pacific/Marquesas"(-09:30)不在Windows的时区选项列表中.注册表根本不包含它; 看到

\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones

在这里我只能选择-09:00或-10:00.所以,如果我要像这样存储时区,我怎样才能获得Windows中的实际偏移/ DST信息(没有Java)?希望这不需要映射表,每当它发生变化时我都要及时更新.是否有一个全球认可的标准比java时区ID更好?

更新

时区信息与数据库上的DATE列结合使用.这些列包含本地日期/时间值.如果某个位置可以与这些值相关联,则该位置的时区使我能够在需要时将日期/时间值转换为UTC或任何其他时区.

我意识到,而不是DATE,TIMESTAMP_TZ数据类型或类似的东西更合适.但是,这将需要数据迁移(再次需要TZ),并且遗留应用程序也不支持它们也可以处理数据(除非更改了大量代码).如果我必须将值转换为UTC,问题几乎相同.

底线是我需要在当地时间保持DATE值,但我需要知道其中一些TZ意味着什么.

java windows oracle timezone

4
推荐指数
1
解决办法
2万
查看次数