我正在开发一个应用程序,但它不工作。屏幕上出现“不幸的是应用程序已停止”消息,但没有任何反应。
问一个问题,他们问我在 logcat 中的堆栈跟踪,但我不知道它是什么以及从哪里获得它?
我正在开发一个应用程序,但它不工作。屏幕上出现“不幸的是应用程序已停止”消息,但没有任何反应。
问一个问题,他们问我在 logcat 中的堆栈跟踪,但我不知道它是什么以及从哪里获得它?
使用平滑变形的主题会很有趣,即在 svg 按钮中将一个图形的轮廓更改为另一个图形的轮廓。
接下来是设计。在初始状态下,该按钮有一个图标 - 左侧有一个黄色星形和“保存”字样
当您单击按钮时,星号会平滑地变为绿色复选框,并且“保存”字样变为“已保存!”字样。
很明显,平滑变形是通过将一个图形的节点坐标更改为另一个图形节点的坐标来实现的。我知道,为了实现这一点,必须满足主要条件——两种形状中的锚点数量必须相同。路径(补丁)不应该有中断。
星形图标示例
<svg width="194.6" height="185.1" viewBox="0 0 194.6 185.1">
<path fill="#FFD41D" d="M97.3,0 127.4,60.9 194.6,70.7 145.9,118.1 157.4,185.1 97.3,153.5 37.2,185.1 48.6,118.1 0,70.7 67.2,60.9"/>
</svg>
复选框图标示例
<svg width="194.6" height="185.1" viewBox="0 0 194.6 185.1">
<path d="M110,58.2 147.3,0 192.1,29 141.7,105.1 118.7,139.8 88.8,185.1 46.1,156.5 0,125 23.5,86.6
71.1,116.7" fill="yellowgreen"/>
</svg>
我是 Python 的新手,并试图通过我所知道的语言——通过 Java 来理解一切。偶然发现if __name__ == "__main__",陷入了昏迷。我阅读了有关该主题的答案,但仍然很难“放下”。在 Java 语言中是否有类似的这些__name__yes ?"__main__"提前致谢。
PS不需要写重复。问题与 Java 没有类似物。不要从肩膀射击。请仔细阅读我的问题。
有一种Java语言。这只是语法。
该语言有一个实现 - 这是一个编译器,可以理解该语言的语法并将其翻译成字节码。
有一个 Java 虚拟机 - 这是一个执行字节码的解释器。据我了解,java因此是跨平台的,因为每个操作系统都有自己的JVM,它可以为这个操作系统翻译字节码。
有一个 Java 开发工具包,它包括:Java 编译器、JVM 以及开发中使用的标准 Java 类和库。JDK 是为开发人员准备的。
有一个 Java 运行时环境——这是 Java 运行时环境。
该主题是作为讨论线程创建的。它提出了几个问题,因此您可以同时回答所有问题和其中一个问题。我给出了一些问题的答案,而不是它是正确的事实。如果有很多兴趣,您可以尝试组织聊天进行讨论。
生物信息学中最常见的任务:在字符串中查找子字符串。在大多数情况下,这是以一种标准方式实现的,不需要大量资源,也不值得详细考虑。但是,在我看来,有一类问题可以通过使用加载的树来加速/简化。
在本主题中,我们将仅考虑精确搜索。
术语解释:
参考:一个长的 DNA 序列,通常包含部分染色体或整个染色体/基因组的转录本。表示(通常)由 A、G、T、C(表示不同的核苷酸)和 N 组成的字符串 - 一个字符,表示任何核苷酸,或不存在确切信息。示例:AAGGCCTCGTCNTTNNGCCC...
模式(或读取):一个短的 DNA 序列,一个包含与上述相同字符的字符串,长度从 1(当然没有意义,但它发生)到几千的合理值。我们主要处理 30 到 300 个字母的长度,但还有其他任务。
回文-互补字符串,即 根据特殊规则倒序(从末尾读取字符串,按规则替换字母:A -> T,C -> G,G -> C,T -> A,N -> N)
对于航班的分析,我们将考虑人类第8条染色体作为参考(A:43333530,C:29030173,G:29103787,T:43300646,N:370500条,总共145138636个字母)。为简单起见,读取长度为 100 个字母。
马上我会告诉我我将在 Delphi 上编写代码。总的来说,我不在乎 - Delphi、c++、c# 或 java,但 Delphi 对我来说更熟悉。
问题 1. 创建树形结构。类或链表。
2个树实现选项:
班级
type
AGTCIndex = (A, C, G, T);
TTrie = class
fAmI: integer; // кто я - на всякий случай
fParent: TTrie; // ссылка на родительский узел
fChildren:array[AGTCIndex] of TTrie; // ссылка на узлы потомков
fCount: array of longint; // для адресации 145 миллионов хватит. Вот если бы работали с геномом секвойи, стоило бы использовать int64 :)
<...>
end;
或链表
type
AGTCIndex = (A, C, G, T);
pTrie = ^TTrie;
TTrie = record
fAmI: integer; // кто я - на всякий случай
fParent: pTrie; // ссылка на родительский узел
fChildren:array[AGTCIndex] of pTrie; // ссылка на узлы потомков
fCount: array of longint;
end;
在我看来,链表更适合我们的任务:内存消耗更少,工作速度更快(我们不要在不必要的调用上浪费时间)。当然,为方便起见,我们将列表包装在一个类中。
问题二、内存消耗
在标准方法中,将花费 145 戈比的内存——这就是一条线需要多少。您可以使用半字节表示(描述及其工作原理)来欺骗和使用 2 倍。
在使用树的情况下,成本将至少为 100 * 145138636 * 16 或至少 230 GB。一切,羊皮得不偿失。可以使用的最大值为 32 GB。我们得出结论,只要参考的长度不超过 1600 万,这种方法是适用的。
原则上,这里也实现了半字节的方法。它甚至可以带来超过 2 倍的收益。但恐怕带来的不便多于好处。如果有其他意见 - 请提出意见。
问题3:精细的搜索性能
在标准方法中,在参考中找到所有包含的模式大约需要 |length(reference)*ln(length(pattern)|。如果并行化,那么内核每增加一倍大约要快 1.6 倍。
在使用树的情况下,根据我的计算,只有在前额上至少需要 O(100 * 长度)才能进行构造。使用阅读框可以减少到 O(30*length)。并行方法还将内核每增加一倍,该过程就会加快 1.6 倍。
总的来说,我们有:创建一棵树比使用标准方法搜索一个模式要多花大约 500 到 1000 倍的时间。但是,由于在已经形成的树中搜索要快得多,而且它允许您并行获取额外的数据,所以我们有: 当引用被重复使用时,创建树的好处是实现的,并且用于不同的模式。评价:至少500次。适用范围:精确映射、仪器数据的流式处理等。
没错,互补搜索存在一个小问题。事实上,我们将不得不从孩子到父母,这会有点慢。
如果主题很有趣,您可以继续进行模糊搜索,这通常更相关和更有趣。
更新 1
创建了一个聊天室
更新 2
**相对于按位表示。大声推理(几乎与树木无关)**
为什么不节省内存和时间,并使用半字节甚至四分之一字节表示?
- 我不确定。我还没有遇到过使用类似方法的单一 GNU 软件(关于付费软件 - 见下文)。所有人都否认兼容性和不愿意为按位工作编写复杂的例程。而最近他们也回答——“内存降价了”。
我对为什么每个人都不使用按位方法的看法:
兼容性并不是特别重要。毕竟,无损转换:您可以随时转换回来。但!通常,相同的程序不仅用于在 DNA 内进行搜索,还用于在蛋白质序列、基因依赖性等内进行搜索。在那里 - 拉丁字母是不够的。
AGTC 是一个非常特殊的情况。还有甲基化核苷酸、双脱氧核苷酸、“可疑”核苷酸等等。那些。“字母”远不止 4 个字母。因此,例程是“为一切”创建的。
在上面的第一个链接上,我举了一个使用半字节表示的例子,我在 2004 年“开发”了一个完整的基因组 triter(Windows 下的第一个 - 我有点自豪:))是创建于 2006 年。然后内存很少,处理器非常愚蠢。主要思想:A=0001b,C=0010b,G=0100b,T=1000b。然后掩码非常成功地叠加在一次搜索多个选项上:N = 1111b、R(A 或 G)= 0101b、Y(C 或 T)= 1010b 等。在 SSE2 中实现了一个大字(64 或 128 位)的半字节移位,它允许您一次处理多达 32 个字母。
所以,关于这个实现,我怀疑这种方法至少用在一个商业包中:) 但是,我并不感到抱歉,特别是因为这种方法是表面上的。
更新 3
发布了问题的第二部分:生物信息学中的加载树。第 2 部分。模糊搜索