在本教程之后,我遇到了Trie数据结构.从最近我一直用PHP编程,我试图用这个来解决讲座的问题.我能够获得正确的答案,但仅适用于较小的输入(输入#10是2,82 MB文件).显然,我的算法不能很好地扩展.它还超过了PHP的默认128 MB内存限制.
Trie中存储了一个根节点.每个节点都有一个"子"成员.我使用标准的PHP数组来存储孩子.子键表示一个字符(当前我为每个字符创建一个新节点,az小写,映射到0-25),子值是对另一个节点的引用.
由于问题,每个节点都有"重量"成员.我想优化我的代码,(甚至使用不同的方法从stratch重写它),以便它可以通过大输入的测试.
我对如果可能的话,使用大输入使这个数据结构在PHP中工作的解决方案感兴趣.
TrieNode类存储树层次结构.
class TrieNode {
// weight is needed for the given problem
public $weight;
/* TrieNode children,
* e.g. [0 => (TrieNode object1), 2 => (TrieNode object2)]
* where 0 stands for 'a', 1 for 'c'
* and TrieNode objects are references to other TrieNodes.
*/
private $children;
function __construct($weight, $children) {
$this->weight = $weight;
$this->children = $children;
}
/** map lower case …Run Code Online (Sandbox Code Playgroud) 看到重置功能在对象上起作用,我感到很惊讶。
<?php
class C {
private $a = 'a';
protected $b = 'b';
public $c = 'c';
}
$c = new C;
echo reset($c); // a
Run Code Online (Sandbox Code Playgroud)
看起来如果reset收到一个对象,它首先将其转换为数组?在文档的任何地方都没有提到。这是实施细节吗?
反编译以下 for-each 循环的 .class 文件会产生有趣的结果。
来源 - Main.java:
public class Main {
public static void main(String[] args) {
String[] names = new String[3];
int var3 = 3;
for (String name : names) {
System.out.println(name);
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果 - Main.class:
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
public class Main {
public Main() {
}
public static void main(String[] args) {
String[] names = new String[3];
int var3 = …Run Code Online (Sandbox Code Playgroud)