Tag: 算法

关于在an​​droid中使用Radix Tree在240k单词列表中进行英语词典单词查询的问题

应用概述 在这个游戏中,你将一封信附加到不断增长的字母链上,但每个玩家都试图不形成一个单词。 在对手选择附加到字母串的字母后,您可以选择说出这是一个字,需要检查某个数据结构。 我需要实现这个数据结构。 数据结构的要求 我需要一个数据结构能够快速判断一个单词是否存在于Android设备上的240000字的列表中。 你应该可以轻松玩最多20场比赛 应该为Android应用程序编写 一个很好的额外function还可以快速显示给定单词中的所有可能单词,但不是必需的。 我尝试了什么 基数树似乎是一个好主意,见下图。 现在我可能会后悔我投入这个时间,因为我认为它需要太多的对象。 每个黑点以及编号的圆圈都将在我的代码中表示为节点object 。 基数树至少需要240k(240,000)个节点,因此对象,每个节点的每个路径都是一个字,这将导致240k字列表。 每个游戏将仅表示存储对树中当前节点的引用,这意味着额外的游戏需要很少的额外存储。 我还认为我可以将它实现为hashMap,其中包含所有可能的单词并循环遍历所有单词并在每个单词后缩小范围。 这似乎是一种计算方法,其中Radix Tree需要较少的计算但需要更多的存储空间。 [编辑]这是我的错误假设,请看下图。 我有问题 Radix Tree是目前大多数Android设备所需的最佳数据结构之一吗? ( 答案/评论似乎表明它是 ) 当你有这么多物品时,它在内存中是如何工作的? 它们都存储在ram中还是存储在磁盘上? 我可以发现这个应用程序总共可以使用16mb / 25mb / 32mb的内存 。 当将240000物体放入撞锤时,我是否可能达到超过16mb的撞锤? 您可以在运行时从文件中存储和检索大型Radix Tree对象吗? 哪个存储在res / raw文件夹中的磁盘上。 会不会(比方说)用游戏地图打开50个游戏,在每个游戏中你必须使用散列图的副本,你可以在其上缩小可能的单词,甚至可能吗? 安装后应用程序可以声明多少额外存储空间? 根据评论: 似乎我的假设是Radix Tree需要更多空间似乎是错误的:要查看更大的图像,请右键单击它并在新选项卡中打开

神经网络需要学习多少个时代? (包括测试结果)

好吧,让我先说一下,我很清楚这取决于很多因素,我正在寻找有经验的人的一些一般指导方针。 我的目标不是制作一个可以为我计算数字平方的神经网络,但我认为这是一个很好的实验,看看我是否正确实现了反向传播算法。 这看起来是个好主意吗? 无论如何,我担心我没有正确地实现学习算法(完全)。 我的测试(结果): 训练数据 :使用Java的随机数在500和0.999之间随机生成500个数字 网络拓扑 : 3层具有1个输入神经元,5个隐藏神经元,1个输出神经元 权重:全部生成为-1到1之间的随机值(java.util.Random.nextDouble()* 2 – 1;) 使用偏置节点:(numOfInputs + 1),以便输入[input.length -1] = 1 激活function :Sigmoid 学习率 :如下面的结果代码所示 没有实施任何动力等 结果: Epochs: 10,000 Learning Rate .25 0.5 = [0.24203878039631344] 0.9 = [0.7942587190918747] 0.1 = [-0.005433286011774396] Changed learning rate to 0.3 0.5 = [0.2891542106869196] 0.9 = [0.8159817287374298] 0.1 = [-0.03614377685205278] Changed […]

关于在词典中查找所有有效词的算法问题

给定一个字典(只是一个字符串列表)。 您收到来自外部来源的未知数量的信件的Feed。 给定一串字母,您将如何列出您可以从这些字母的任何组合中制作的所有有效单词(来自diciontary)。 所以如果你收到:abpplead 你应该找到苹果,坏,垫,铅等。 我知道没有最好的答案。 但是有哪些合理有效的方法,使用什么数据结构等等。 此外,假设您可以预处理输入,因此您可以选择将输入字母存储在您想要的任何数据结构中。

如何获得5或10的下一个最高倍数

根据一些规则,我希望根据一些规则获得次高的数字,因为我在描述它们时遇到一些困难,我将通过例子来说明: Input Desired output ——- ————– 0.08 0.1 0.2 0.5 5 10 7 10 99 100 100 500 2345 5000 在某种意义上,输出应该是“5或10的下一个最高倍数”。 我希望这是可以理解的; 如果没有,请告诉我。 执行将在java和输入将是正double s。

迷宫生成prim算法并非遍历所有细胞

我正在尝试实现Prim迷宫生成算法: 从充满墙壁的网格开始。 选择一个单元格,将其标记为迷宫的一部分。 将单元格的墙添加到墙列表中。 虽然列表中有墙: 从列表中选择一个随机墙。 如果细胞在另一侧 尚未进入迷宫: 使墙成为通道,并将对面的细胞标记为迷宫的一部分。 将单元格的相邻墙添加到墙列表中。 如果对面的单元格已经在迷宫中,请从列表中移除墙壁。 删除一些实现细节,我的实现如下所示: Cell[][] maze 是带有细胞的矩阵。 每个单元格都有左/右/上/按钮墙。 边界墙标记为boolean frontier ,并不是实施的一部分,因为我想保持我的迷宫框架。 public Cell[][] prim(){ List walls = new ArrayList(); //Pick a cell, mark it as part of the maze int initialCellI = rnd(sizeX)-1; int initialCellJ = rnd(sizeY)-1; Cell randomCell = maze[initialCellI][initialCellJ]; randomCell.setPartOftheMaze(true); //Add the walls of the […]

通过平方来表示

当我通过平方搜索Exponentiation时我得到了递归方法,但后来我偶然发现了这个伪代码,我无法完全理解。 function powermod(base, exponent, modulus) { if (base < 1 || exponent < 0 || modulus 0) { if ((exponent % 2) == 1) { result = (result * base) % modulus; } base = (base * base) % modulus; exponent = floor(exponent / 2); } return result; } 如果你能用简单的术语给出一些见解,那将会有很大的帮助

什么构成算法上下文中的“数组访问”?

下面是一个用Java编写的LSD Radix排序实现,用于对一个字符串数组进行排序,其中每个字符串都包含正好的W字符。 我想计算运行时的数组访问次数。 我已经读过LSD排序应该要求n * c数组访问,其中n是字符串数, c是每个字符串中的字符数。 但是,下面的算法会多次访问多个数组。 如果我在每个中增加一个计数器,我最终会得到一个重要因素nc 。 那么究竟什么构成了算法上下文中的“数组访问”? 是否只有一个数组访问实例被认为是更重要的,我应该在这里计算,或者这个例子实际上是一个低效的实现,它使用了比必要更多的数组访问? public int lsdSort(String[] array, int W) { int access = 0; // Sort a[] on leading W characters. int N = array.length; String[] aux = new String[N]; for (int d = W-1; d >= 0; d–) { // Sort by key-indexed counting on […]

如何在飞行中做组合

我有一个非常奇怪的问题,有一些限制,使其难以解决。 我有一个列表列表,我想要对这些列表中的所有项目进行组合。 每个项目都有一个名称和一个值。 这是一个例子: 主要清单: 清单01: Item 01:name:name01,value:value01 项目02:名称:name02,值:value02 清单02: 项目01:名称:name03,值:value03 清单03: 项目01:名称:name04,值:value04 项目02:名称:name05,值:value05 最终结果应如下所示: 一些清单: 项目01:name01:value01,name03:value03,name04:value04 项目02:name02:value02,name03:value03,name04:value04 项03:name03:value03,name03:value03,name04:value04 项04:name01:value01,name03:value03,name04:value05 项目05:name02:value02,name03:value03,name04:value05 项目06:name03:value03,name03:value03,name04:value05 新列表几乎包含像哈希映射一样的项目。 约束如下: 我无法收集到新的列表并将它们混合起来,因为这些列表很快就会变得非常大。 我正在使用某种类似观察者的API,所以我需要尽快让观察者了解结果,这样我才不会使用太多内存。 换句话说,该组合生成器可以用X个列表来提供,每个列表可以包含N个项目,并且我必须生成它们的组合而不使用太多的存储器。 我不希望一次使用超过5个列表,但我想使算法尽可能适应代码更改。 我正在解决java中的问题,但算法也应该在其他语言中同样工作,因为它很可能被翻译。 你有什么想法,建议吗? 提前致谢。 PS我不认为递归会很好。 我正在研究使用while循环和一些嵌套循环的想法,但是很难想象它应该如何工作。

Java服务器和浏览器客户端之间的乐观对象复制的解决方案?

我正在构建一个系统,其中多个用户需要同时创建,查看和修改一组对象。 该系统计划在Java服务器和现代浏览器客户端上运行(我可以选择哪些)。 面对网络和服务器中断,它必须是健壮的,用户界面不得阻止修改,修改需要在本地存储并在连接返回时发布。 在正常操作下,更改应以亚秒级延迟复制。 网络延迟和带宽,cpu资源不太可能是大问题,规模大约是几十到几百个客户端。 可以将对象视为primefaces值和结构集(即树)的结构。 看来对象之间的引用是不必要的。 我对属性级别的last-write-wins冲突解决方案感到满意,对快照一致性没有任何特殊要求。 我想通过UI报告写冲突。 最初我想解决服务器和多个客户端之间的复制问题。 在未来,我可能也需要多级树。 任意复制结构不是必需的,但可以使故障转移或多主机更容易。 我遇到麻烦的问题是复制系统之间对象的更改。 分布式并发很难,我想将这种复杂性委托给知道他在做什么的人。 哪些库/框架可以帮助复制部分? 我已经找到了XSTM ,它的任务似乎几乎正是我所需要的,但不幸的是GWT部分似乎还没有准备好,而且该项目似乎有一个不确定的未来。 如果没有什么真正有用的,那么我正在寻找关于什么算法对此有用的想法? 我目前正在考虑受DVCS和运营转型启发的事情。 服务器将接受对象的更改集并拒绝冲突的写入。 客户端将跟踪上次已知的服务器状态和本地更改,检测已发布的更改与本地更改之间的冲突,并在接收的服务器状态之上进行无冲突的本地更改。

没有“if-else”或“switch-case”的度量转换算法

我想编写一个可以将一个单元转换为另一个单元的程序。 假设我有2种方法。第一种方法可以进行度量转换 ,第二种方法可以进行权重转换 。 例如; 1. long km=metricConvLength(long mil,Enum.mil,Enum.km);//first method 2. long agirlik=metricConvWeight(long kg,Enum.mil,Enum.km);//second method 我想对这些变量使用Enum结构。 我的程序可以转换这些东西和对立面; 海里 – 公里 海里英里 英尺 – 公里 英尺 – 米尔 磅 – 公斤 ons- gr inc – cm 院子里 – 米 结 – 公里 我的问题:我不想使用if-else或switch-case结构来进行转换。(因为如果我使用if-else结构,我的代码看起来很糟糕,很容易和慢。如果我需要50以上-else struct,如果我使用这些struct.This is grind。) 我可以在不使用if-else或switch-case的情况下为这些转换编写算法。 我的目的是减少代码,减少工作量。 关于算法的任何提示?