我在Java中编写代码,使用无序的根树,其中每个节点可以有任意数量的子节点.给定树T和子树S,我希望能够找到T中与S匹配的所有子树(即T中与S同构的所有子树).
如果S的节点可以映射到T的节点,使得S的边缘映射到T中的边缘,则T的子树与S同构.
一个先前的问题已经被问如何找到如果树包含另一个子树,但是我希望能够找到所有 T中的子树匹配的S.此外,我希望能够从每个节点在T映象在每场比赛S中的对应节点
也就是说,当找到匹配时,它应该不仅仅作为指向T中节点的指针返回,其中树的根与S匹配,但匹配应该返回为类似于节点指针对的列表[ (T1,S1),(T2,S2),...(Tn,Sn)]使得T1是指向T中的节点的指针,该节点映射到子树中的节点S1,依此类推.
或者,可以返回简单的值对列表,因为树T中的每个节点和子树S具有与之关联的唯一整数标识符.
例如:
鉴于树T如下:
a
/ \
b c
/ \
d e
Run Code Online (Sandbox Code Playgroud)
和子树S为:
x
/ \
y z
Run Code Online (Sandbox Code Playgroud)
应返回以下匹配列表:
[(a,x),(b,y),(c,z)] [(b,x),(d,y),(e,z)]
唯一匹配由T中的节点集确定,而不是 T和S中节点之间的映射.
所以以下匹配:
[(a,x),(b,z),(c,y)]
被认为是重复的
[(a,x),(b,y),(c,z)]
因为它们具有来自T(a,b,c)的相同节点集,所以只应返回其中一个匹配.
另一个例子,给定树T:
a
/|\
b c d
Run Code Online (Sandbox Code Playgroud)
和子树S:
x
/ \
y z
Run Code Online (Sandbox Code Playgroud)
应返回以下匹配列表:
[(a,x),(b,y),(c,z)] [(a,x),(b,y),(d,z)] [(a,x),(c,y) ,(d,Z)〕
任何人都可以提供任何示例代码如何做到这一点?
编辑(与Chris Kannon的评论有关):
我想你想要有人为你编码答案?你到底有多远?你写了什么代码? - Chris Kannon 1小时前
我有以下代码,在运行时,构建一个指向树中节点的指针列表(matchesList),其中子树根与给定的子树相匹配.但是,可能存在多个以同一节点为根的子树,并且当前每个节点最多只会添加一次到matchesList,而不管有多少匹配在那里.
另外,我无法弄清楚如何在子树中的节点和原始树中找到的匹配节点之间建立上述映射.
package Example;
import java.util.LinkedList;
import java.util.Vector;
public …Run Code Online (Sandbox Code Playgroud) 我正在使用Git的子树命令将几个库拉入项目中.
如果我然后以正常方式克隆项目,我最终得到了我需要的所有代码,但是我丢失了子树关系 - 在克隆中,每个库都没有远程,并且没有-push分支的任何一方.
重建这种连接的最佳方法是什么?
这样做是否足够
git remote add <lib> <remote-url>
git fetch <lib>
Run Code Online (Sandbox Code Playgroud)
如果我是第一次添加该库,我将遵循以下内容:
git subtree add -P <local/lib> --squash "<lib>/master"
Run Code Online (Sandbox Code Playgroud)
当本地目录已经存在时,这不起作用,当然,当您克隆已经添加了库的项目时,它将会发生.
在这种情况下还有什么应该做的,以确保后续的git子树合并和git子树分割命令到预期的东西?
我正在广泛使用org-mode和org-attach,这意味着可以有许多与一个org文件关联的附件目录.
在worg上我找到了Matt Lundi的一个函数,它允许查看属于整个文件的所有附件并用ido浏览它们.
我想将此函数限制为一个子树,这将使它对我的用例更有用.
因为我不是emacs的新手,但我几乎完全是文盲,我在这里问.
这是功能:
(defun my-ido-find-org-attach ()
"Find files in org-attachment directory"
(interactive)
(let* ((enable-recursive-minibuffers t)
(files (find-lisp-find-files org-attach-directory "."))
(file-assoc-list
(mapcar (lambda (x)
(cons (file-name-nondirectory x)
x))
files))
(filename-list
(remove-duplicates (mapcar #'car file-assoc-list)
:test #'string=))
(filename (ido-completing-read "Org attachments: " filename-list nil t))
(longname (cdr (assoc filename file-assoc-list))))
(ido-set-current-directory
(if (file-directory-p longname)
longname
(file-name-directory longname)))
(setq ido-exit 'refresh
ido-text-init ido-text
ido-rotate-temp t)
(exit-minibuffer)))
Run Code Online (Sandbox Code Playgroud) 我是一名研究生,有许多脚本,bibtex的书目数据,乳胶论文草稿,开放式办公室的演示文稿,书写的海报,以及数字和结果数据.我想将所有内容放在版本控制下的一个项目中.然后,当我需要处理诸如参考书目数据之类的部分时,我想检查该子目录,根据需要进行修改并将其合并.我希望能够将一个版本签出到我的家用计算机,并且与我的工作计算机不同,并对每个计算机进行独立更改并最终将它们合并.我还希望能够从这个大项目中查看一段代码并将其与版本导入一个单独的项目中.如果我可以改变,我希望能够将它们合并回原始项目.
根据我的理解,git子树可以做到这一点.
http://github.com/apenwarr/git-subtree
有一个例子与我正在尝试做的事情一致:
http://psionides.jogger.pl/2010/02/04/sharing-code-between-projects-with-git-subtree/
假设我的项目的主干包含目录:(bib bin cfg data fig src todo).
我用的时候
git subtree split -P bib -b export
git checkout export
Run Code Online (Sandbox Code Playgroud)
我得到一个bib目录,加上所有应该被忽略的文件或基于.gitignore的二进制文件,例如src目录以及以tilde或./data目录结尾的所有内容.
dwickrama@DWwork:~/research/trunk$ ls * -r
biblography.bib JabRef
src:
script1.sh~ README~ script2.sh~
script3.sh~ script4.R~ script5.awk~
script5.py~
cfg:
cfgFile1.ini~ cfgFile2.ini~ cfgFile3.ini~
bin:
bigBinaryPackage1 bigBinaryPackage2
dwickrama@DWwork:~/research/trunk$
Run Code Online (Sandbox Code Playgroud)
我的.gitignore文件如下:
*.doc diff=word
*.tex diff=tex
*.bib diff=bibtex
*.py diff=python
*.eps binary
*.jpg binary
*.png binary
./bin/* binary
*~
Run Code Online (Sandbox Code Playgroud)
我该如何防止这种情况?
我一整天都在研究这个问题,我正在重写我们的一个旧产品,而且我很难确定如何在流程图中找到特定的节点.这个问题让我想起了大学,但对于我的生活,我无法想出一个算法来解决这个问题.
我附上3个屏幕截图来帮助解释这一点,但基本问题是,给出是/否?决策节点,找到终止分支的最近的子节点.
我在C#.NET和JSON工作.在JSON中,我有一个对象,它为每个节点提供唯一的标识符,并且还标识从一个节点到下一个节点的每个"链接".我希望编写一个函数(或几个)来确定给定C#中的分支节点的第一个"结束节点".目前我已经在C#中将jSON构建为XML.
鼓励任何和所有想法,不是真正寻找代码而是寻找方法/算法.


附件是图中jSON的输出:
{ "class": "go.GraphLinksModel",
"linkFromPortIdProperty": "fromPort",
"linkToPortIdProperty": "toPort",
"nodeDataArray": [
{"key":-1, "category":"Start", "loc":"169 288", "text":"Start"},
{"key":-2, "category":"End", "loc":"855 394", "text":"End"},
{"category":"Branch", "text":"Yes or No", "key":-4, "loc":"284.8837209302326 285.7848837209302"},
{"category":"DelayNode", "text":"Delay", "key":-3, "loc":"365.8837209302326 215.52345997177622"},
{"category":"Branch", "text":"Yes or No", "key":-5, "loc":"478.8837209302326 214.52345997177622"},
{"category":"DelayNode", "text":"Delay", "key":-6, "loc":"568.8837209302326 151.52345997177622"},
{"category":"DelayNode", "text":"Delay", "key":-7, "loc":"573.8837209302326 268.5234599717762"},
{"category":"DelayNode", "text":"Delay", "key":-8, "loc":"653.8837209302326 215.52345997177622"},
{"category":"Branch", "text":"Yes or No", "key":-9, "loc":"392.8837209302326 392.5234599717762"},
{"category":"DelayNode", "text":"Delay", "key":-10, "loc":"454.8837209302326 317.5234599717762"},
{"category":"DelayNode", "text":"Delay", "key":-11, "loc":"550.8837209302326 473.5234599717762"},
{"category":"DelayNode", "text":"Delay", "key":-12, "loc":"549.8837209302326 317.5234599717762"}, …Run Code Online (Sandbox Code Playgroud) 我想使用子树合并将远程项目拉入我自己的git树中的目录.我按照这里的说明操作: 使用子树合并
但我不知道如何签出标签.我想这是一个常见的请求 - 您想要引入一个外部项目,但获得一个安全的标记版本的源代码.子树合并解决方案效果很好,但我不知道如何获得我想要的标签?喜欢git,但有时会伤到我的头......
我添加了一个子树
git subtree add --prefix=path/to/example --squash git@github.com:johndoe/example.git master
Run Code Online (Sandbox Code Playgroud)
并想要删除它.没有git subtree rm命令.我已经删除了所有文件path/to/example,但path/to/example仍出现在我列出的子树通过
git log | grep git-subtree-dir | awk '{ print $2 }'
Run Code Online (Sandbox Code Playgroud)
如何从git中删除子树引用,使其无法再被推/拉/等?
我在git上添加了一个似乎正在工作的子树.我进入目录并进行了一些更改然后推送.
我注意到这些更改显示在父项目中,但我用作源的存储库尚未更新.
我试过git subtree push哪个返回:
您必须提供--prefix选项.
还git subtree push --prefix=my/folder git@mygitrepo.com返回:
你必须提供
<repository> <ref>
将更改推送到我的git子树的原始仓库的正确方法是什么?
编辑:有人建议我这样做:
git subtree push --prefix=my/folder origin master
Run Code Online (Sandbox Code Playgroud)
当我运行上面的程序时,它会启动进程,但最终会说分支落后了.所以我跑:
git subtree pull --prefix=my/folder origin master
Run Code Online (Sandbox Code Playgroud)
返回"已经是最新的"
当我们使用子树合并策略时,git如何找到子树?我在这里只找到一个提到:"它实际上猜测你要合并的子树.通常,这神奇地证明是正确的,但如果你的子树包含很多变化(或者原来是空的,或者其他什么),那么它可能会失败." 它如何猜测,如果失败,我该怎么做?自2009年8月以来,这个答案是什么时候发生了变化?