- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下带有 3 个输入变量(开始、停止和时间)的 Dijkstra 算法。大约需要0.5-1s完成。我的托管服务提供商说它使用了太多资源,我应该实现一些缓存机制。我的问题是,怎么做?
因为我有 3 个变量,如果只有其中一个发生变化 - 整个结果是不同的(因为我有一些额外的时间语句,没关系)。那么如何实现一些缓存机制或者做一些优化呢?
我有 1700 个节点。
<?php require_once("../includes/db_connection.php"); ?>
<?php require("../includes/functions.php"); ?>
<?php require("../includes/global_variables.php"); ?>
<?php
// Function to put "maxValues" into time (in my case 10 000 because I know it can't take longer than that from source to end node)
function array_push_key(&$array, $key, $value) {
$array[$key] = $value;
}
// Start the counter
$timeM = microtime(); $timeM = explode(' ', $timeM); $timeM = $timeM[1] + $timeM[0]; $start = $timeM;
// Get provided values
$startStop = $_GET["start"];
$endStop = $_GET["end"];
$startTime = $_GET["time"];
// Initialize arrays
$time = array();
$previousNode = array();
$allStops = array();
// [5] = 119 --> You can get to stop no. 5 by line no. 119
// line to source node is 0
$lineToThisStop = array();
$lineToThisStop[$startStop] = 0;
// Populate arrays
$result=mysql_query("SELECT stop_id FROM db_stops", $connection);
potvrdi_unos($result);
$counter = 0;
while($rows = mysql_fetch_array($result)){
array_push_key($time, $rows["stop_id"], 10000);
array_push($allStops, $rows["stop_id"]);
// Locate startStop in the allStops array to unset it few lines later
if ($rows["id"] == $startStop) {
$poz = $brojac;
}
$counter++;
}
// Set starting time to starting stop
$time[$startStop] = $startTime;
// Set it activeNode
$activeNode = $startStop;
// Unset it in allStops array (so it doens't have to be checked later)
unset($allStops[$poz]);
$allStops = array_values($allStops);
// I can put "while (true)" because all nodes are connected in "one piece", there is NO UNCONNECTED nodes
while (true) {
$result=mysql_query("SELECT route_id, next_stop FROM db_stop_times WHERE stop_id = $activeNode", $connection);
potvrdi_unos($result);
while($rows = mysql_fetch_array($result)) {
// Draw paths from active node to all other (connected) stops
$nextStopArray = $rows["next_stop"];
// nextStopArray is something like "0,34,123,3123,213" - those are all stops from current, active node/stop
$nextStopArray = explode(",", $nextStopArray);
// sometimes it's just "4" to convert it into array
if (!is_array($nextStopArray)) {
$nextStopArray[0] = $nextStopArray;
}
for ($p = 0; $p < sizeof($nextStopArray); $p++) {
$nextStop = $nextStopArray[$p];
$walkToTheStop = false;
// Few checks
if ($p == 0) {
if ($nextStop != 0) {
$pathDuration = 2;
if ($lineToThisStop[$activeNode] != $rows["route_id"]) {
$pathDuration = $pathDuration * 2;
}
}
} else {
$walkToTheStop = true;
$pathDuration = 1;
}
// If that's shortest path from ActiveNode to nextStop insert it into it's time array (time to get to that stop)
if (($pathDuration + $time[$activeNode]) < $time[$nextStop]) {
$time[$nextStop] = $pathDuration + $time[$activeNode];
array_push_key($previousNode, $nextStop, $activeNode);
// Some aditional records (5000 means "you must walk to that stop")
if ($walkToTheStop) {
$lineToThisStop[$nextStop] = 5000;
} else {
$lineToThisStop[$nextStop] = $rows["route_id"];
}
}
}
}
// Traži slijedeću stanicu (vrh) s najmanjom vrijednosti
$lowestValue = 10000 + 1;
for ($j = 0; $j < sizeof($allStops); $j++) {
if ($time[$allStops[$j]] < $lowestValue) {
$lowestValue = $time[$allStops[$j]];
$activeNode = $allStops[$j];
// Record it's position so I can unset it later
$activeNodePosition = $j;
}
}
// Unset the active node from the array - so loop before will be shorter every time for one node/stop
unset($allStops[$activeNodePosition]);
$allStops = array_values($allStops);
// If you get to the end stop, feel free to break out of the loop
if ($activeNode == $endStop) {
break;
}
}
// How long did it take?
$timeM = microtime(); $timeM = explode(' ', $timeM); $timeM = $timeM[1] + $timeM[0]; $finish = $timeM;
$total_time = round(($finish - $start), 4);
echo 'Total time '.$total_time.' seconds.'."<br />";
?>
<?php require_once("../includes/close_connection.php"); ?>
最佳答案
微优化,但不要:
for ($p = 0; $p < sizeof($nextStopArray); $p++) {
...
}
在循环之前计算 sizeof($nextStopArray) ,否则每次迭代都要计算(并且这个值不会改变)
$nextStopArraySize = sizeof($nextStopArray);
for ($p = 0; $p < $nextStopArraySize; ++$p) {
...
}
有几个地方应该更改。
如果你迭代几千次,++$p 比 $p++ 快
但是分析函数...找出哪些部分执行时间最长,并着眼于优化这些部分。
编辑
摆脱 array_push_key 作为函数,简单地内联执行它......否则会花费你不必要的函数调用
在 while(true) 循环之外构建数据库中所有节点的数组...在单个 SQL 查询中检索所有数据并构建查找数组。
替换
for ($p = 0; $p < sizeof($nextStopArray); $p++) {
与
$nextStopArraySize = sizeof($nextStopArray);
$p = -1
while (++$p < $nextStopArraySize) {
...
}
也可能证明速度更快(只需检查逻辑是否循环了正确的次数)。
关于php - Dijkstra算法优化/缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5034623/
谁能告诉我这个 Dijkstra 算法中优先级队列的空间复杂度。请注意,这里可以将一个顶点添加到队列中不止一次。但是,由于访问集,它不会被处理超过一次。这就是为什么我想知道队列的最大大小可以达到的原因
为什么我们不能将 Dijkstra 算法应用于具有负权重的图? 最佳答案 如果每次从 C 到 D 旅行都得到报酬,那么找到从 A 到 B 的最便宜的路径意味着什么? 如果两个节点之间存在负权重,则“最
我正在阅读 工作中的程序员 . 我在 Donald Knuth 的采访中看到了这一段。 Seibel: It seems a lot of the people I’ve talked to had
我一整天都在努力理解 Dijkstra 算法并实现,但没有取得任何重大成果。我有一个城市及其距离的矩阵。我想做的是给定一个起点和一个终点,找到城市之间的最短路径。 示例: __0__ __1
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
一 问题描述 小明为位置1,求他到其他各顶点的距离。 二 实现 package graph.dijkstra; import java.util.Scanner; import java.util.
一 问题背景 在现实生活中,很多问题都可以转化为图来解决问题。例如,计算地图中两点之间的最短距离、网络最小成本布线,以及工程进度控制,等等。这些问题都涉及最小路径的求解。 二 Dijkstra 算法
谁能告诉我这个程序的错误在哪里,这真的很有帮助,我尽力解决了这个问题,这段代码只通过了两个测试用例给定一个无向图和一个起始节点,确定从起始节点到图中所有其他节点的最短路径的长度。如果一个节点不可到达,
除了 Dijkstra 之外,还有其他方法可以计算接近完整图的最短路径吗?我有大约 8,000 个节点和大约 1800 万条边。我已经完成了线程 "a to b on map"并决定使用 Dijkst
我知道 Dijkstra 的算法、Floyd-Warshall 算法和 Bellman-Ford 算法,用于查找图中 2 个顶点之间的最便宜路径。 但是当所有边的成本都相同时,最便宜的路径是边数最少的
我的问题如下:根据不同的消息来源,Dijkstra 算法只不过是 Uniform Cost Search 的一种变体。我们知道 Dijkstra 的算法会找到源和所有目的地(单源)之间的最短路径。但是
所以我的问题是我有一个带有 的有向图 G非负 边长度,我希望找到两个节点 u 和 v 之间的最短路径,以便它们只通过图中的一个标记节点。 如果我们没有涉及标记节点的条件,这个问题可以使用 Dijkst
对于使用最小堆优先级队列的 Dijkstra 实现,我将其设置为查找网络上不存在的站,以便它必须检查所有内容。我的问题是由于整体时间复杂度 O(V + E log V) ,为什么网络查找到一个站点的最
我试图找出是否可以使用 Dijkstra 算法来找到有向无环路径中的最长路径。我知道由于负成本循环,不可能在一般图中找到 Dijkstra 的最长路径。但我认为它应该在 DAG 中工作。通过谷歌我发现
我正在研究 Dijkstra 算法,我真的需要找到所有可能的最短路径,而不仅仅是一条。我正在使用邻接矩阵并应用 Dijkstra 算法,我可以找到最短路径。但是我需要以最低成本找到所有路径,我的意思是
我正在尝试创建 Dijkstra 寻路的实现,除了我要求它创建一条在同一位置开始和结束的路线之外,它似乎工作得很好。 JSFiddle:http://jsfiddle.net/Lt6b4ecr/ 我需
我们可以使用负权重的 Dijkstra 算法吗? 停止! 在您认为“大声笑,您可以在两点之间无休止地跳跃并获得无限便宜的路径”之前,我更多地考虑的是单向路径。 对此的应用程序将是一个带有点的山地地形。
我认为 Dijkstra 算法是确定的,因此,如果您选择相同的起始顶点,您将得到相同的结果(到每个其他顶点的距离相同)。但我不认为它是确定性的(它为每个操作定义了以下操作),因为这意味着它不必首先搜索
我找到了this code使用 Dijkstra 算法来查找加权图中两个节点之间的最短路径。我看到的是代码没有跟踪访问过的节点。但是它对于我尝试过的所有输入都适用。我添加了一行代码来跟踪访问过的节点。
我将 Dijkstra 算法 的 C++ 实现转换为 Java。当我运行 Java 代码时,我没有得到预期的输出 我的 C++ 代码的预期: Minimum distance for source v
我是一名优秀的程序员,十分优秀!