以下嵌套循环的Big-O时间复杂度是多少:
for(int i = 0; i < N; i++)
{
for(int j = i + 1; j < N; j++)
{
System.out.println("i = " + i + " j = " + j);
}
}
Run Code Online (Sandbox Code Playgroud)
它还是O(N ^ 2)吗?
Crayon Physics Deluxe是最近推出的商业游戏.观看主链接上的视频,了解我在说什么.
它允许您绘制形状并让它们与适当的物理反应.目标是使用您构建的装置和形状将球移动到屏幕上的星形.
虽然游戏基本上是流行的Box2D物理引擎的包装器,但它确实有一个功能,我很好奇它是如何实现的.
它的绘图看起来非常像蜡笔.你可以看到蜡笔的质地,因为它绘制的厚度和暗度各不相同,就像真正的蜡笔画一样.

(来源:kloonigames.com) 
(来源:kloonigames.com)
背景纹理在这里免费提供.
alt text http://img267.imageshack.us/img267/1488/crayonmh7.png
关闭蜡笔画 - 注意不同的黑暗
将使用什么样的算法以看起来像蜡笔的方式渲染这些线?这是一个简单的纹理应用随机厚度和黑暗还是还有更多的东西?
我正在构建一个C#windows应用程序.我想要它,所以每当我点击我的表单中的更新按钮时,应用程序将开始查找我的服务器上是否有新版本可用.
如果有,则继续更新软件.
这通常如何处理?
什么是C#/ .net最好的拼写检查库?
(这将是基于Web的,因此WPF的内置拼写检查将不起作用.)
我的/ Views文件夹中有默认的_ViewStart.cshtml.我希望能够访问我的ViewBag对象,以便为所有视图设置默认标题.
但是,有:
@{
Layout = "~/Views/Shared/SiteLayout.cshtml";
ViewBag.Title = "bytecourse - Online Courses in Technology";
}
Run Code Online (Sandbox Code Playgroud)
我得到"名称'ViewBag'在当前上下文中不存在"作为运行时错误.
我需要做什么?
我刚创建了一个Google Code SVN存储库,用于存储我的学校项目和家庭作业,并允许在学校和家庭之间轻松转移.
它创建的默认目录是:
https://simucal-projects.googlecode.com/svn/trunk/
https://simucal-projects.googlecode.com/svn/tags/
https://simucal-projects.googlecode.com/svn/branches/
我从来没有为多个项目使用过存储库,但在阅读之后:一个svn存储库还是很多?我决定为我所有的随机学校项目建立一个单独的存储库.
我应该只复制上面的文件夹结构,但对于每个项目?
https://simucal-projects.googlecode.com/svn/projectA/trunk/
https://simucal-projects.googlecode.com/svn/projectA/tags/
https://simucal-projects.googlecode.com/svn/了projectA /分支机构/https://simucal-projects.googlecode.com/svn/projectB/trunk/
https://simucal-projects.googlecode.com/svn/projectB/tags/
https://simucal-projects.googlecode.com/svn/项目B /分支机构/
这是多项目一体回购人员的做法吗?
我写了一个简单的物理建模器,它允许我在屏幕周围弹跳球.您可以单击并拖动以启动球,或者您可以一次生成数百个球并观察它们彼此交互.
alt text http://i41.tinypic.com/2zr0oic.png
[链接到更大的版本]
这是一个很有趣的小程序,如果可以的话,我想进一步研究它.我知道他们说早熟优化是所有邪恶的根源,但我开始遇到实际的性能障碍,我想知道是否有任何有游戏/模拟器开发经验的人可以帮助我.
问题:
现在,如果你添加太多球(我的机器上似乎无法处理超过800个),我的程序就会窒息.如果这样做,模拟不再现实,并且所有球在底部彼此重叠.
问题在于碰撞检测.在最天真的情况下,碰撞检测是O(N ^ 2)问题.每个球都会检查每一个球.这很快就会导致性能下降(即使在100个球之后,你也会在每个循环周期进行10k次碰撞检查).
如果你看这里,你可以看到我添加了几百个球的截图.模拟器无法跟上,它们开始相互重叠.
alt text http://i41.tinypic.com/2nsnuqd.png
[链接到更大的版本]
目前,我通过寻找重叠球来检测碰撞.如果我找到两个重叠的球,我将它们按最小平移距离(MTD)分开,或将它们分开.然后,我使用一个简单的物理方程来调整它们的脉冲矢量,然后在碰撞后它们向不同的方向移动.
它的效果很好,除非有太多的球,最小的平移距离变得明显.它们开始大量重叠并且不断地在底部互相挤压.我越是"增加"引力就越糟糕.它们上的压力增加,它们被压缩/相互重叠的量增加.
再说一次,我没有问题,直到我击中了相当数量的N球.
当前优化方法:
碰撞检测 -
扫描和修剪 - (又称排序和扫描)
我在我的球上使用插入排序,每个循环沿x轴循环.由于插入排序的性质,我可以利用我的模拟器的时间一致性.框架到框架,球的位置只是稍微改变,因此排序没有太多工作要做.这使得线性分类分摊运行时间为O(N)或线性而不是其平均运行时间O(N ^ 2).
由于球是排序的,我在检查碰撞之前在第二个循环中做了几次预检查.现在我只需要检查彼此附近的球(因为它们沿着x轴排序),并且当我检查球与另一个球的xmin大于当前球的xmax时,我会突破第二个循环.所以它跳过了成千上万的支票.
当我实现这一点时,它带来了巨大的速度提升.但是,我仍然希望能够处理超过600-800个球.我已经阅读过物理引擎,可以轻松地同时处理10k个物体之间的碰撞检测,所以我想我可以通过一点点工作达到1-2k.
在运行了一个分析器之后,碰巧检测器占用了大约55%的时间,而渲染器占用了大约45%.所以,这是我最昂贵的两个成本.
题:
你能想到任何更好的算法或技术,让我的模拟器能够处理更多的球吗?
相关守则:
整个项目:
svn checkout http://simucal-projects.googlecode.com/svn/ballbounce/trunk/
或者,单击此处在浏览器中手动浏览文件.
感兴趣的部分:
在Java中,我可以通过一个扫描一个字符串,然后我可以做的得心应手之类的东西,scanner.hasNext()或者scanner.nextInt(),scanner.nextDouble()等.
这允许一些非常干净的代码来解析包含数字行的字符串.
这是如何在C#中完成的?
如果你有一个字符串说:
"0 0 1 22 39 0 0 1 2 33 33"
Run Code Online (Sandbox Code Playgroud)
在Java中,我会将其传递给扫描仪并执行操作
while(scanner.hasNext())
myArray[i++] = scanner.nextInt();
Run Code Online (Sandbox Code Playgroud)
或者非常相似的东西.什么是C#'这样做的方法?
在编写自己的自动更新程序时,是否有一个我应该遵循的通用框架?
前一段时间我正在阅读如何创建一个"引导过滤器",它将在主应用程序之前首先加载(因为由于文件锁定而无法更新正在运行的应用程序等)
那么任何提示/最佳实践呢?
c# ×3
.net ×2
svn ×2
asp.net ×1
auto-update ×1
big-o ×1
dvcs ×1
git ×1
graphics ×1
java ×1
nested-loops ×1
optimization ×1
physics ×1
razor ×1
repository ×1
string ×1
updating ×1