此时我觉得有点厚.我花了几天时间试图完全用后缀树构建我的头,但由于我没有数学背景,因为他们开始过度使用数学符号系统时,许多解释都没有.最接近我发现的一个很好的解释是使用后缀树进行快速字符串搜索,但是他隐藏了各种点,并且算法的某些方面仍然不清楚.
在Stack Overflow中对此算法的逐步解释对于我以外的许多其他人来说都是非常宝贵的,我敢肯定.
作为参考,这里是Ukkonen关于该算法的论文:http://www.cs.helsinki.fi/u/ukkonen/SuffixT1withFigs.pdf
到目前为止我的基本理解:
基本算法似乎是O(n 2),正如我们在大多数解释中所指出的那样,因为我们需要遍历所有前缀,然后我们需要逐步遍历每个前缀的每个后缀.由于他使用的后缀指针技术,Ukkonen的算法显然是独一无二的,尽管我认为这是我无法理解的.
我也很难理解:
这是完成的C#源代码.它不仅工作正常,而且支持自动规范化,并提供更好看的输出文本图形.源代码和示例输出位于:
更新2017-11-04
多年以后,我发现了后缀树的新用途,并在JavaScript中实现了该算法.要点如下.它应该没有错误.npm install chalk从同一位置将其转储到js文件中,然后使用node.js运行以查看一些彩色输出.在同一个Gist中有一个精简版本,没有任何调试代码.
https://gist.github.com/axefrog/c347bf0f5e0723cbd09b1aaed6ec6fc6
我的产品具有简单的REST API,因此产品的用户可以直接与产品功能集成,而无需使用我的Web用户界面.
最近,我一直对各种第三方感兴趣,他们将桌面客户端与API集成,以允许我的产品用户使用该第三方应用程序访问他们的数据.
我已经看到想要使用Twitter的应用程序使用Twitter托管的登录页面进行身份验证,该登录页面授予特定应用程序访问该用户数据的权限.单击"允许"或"拒绝"按钮,验证过程完成.Facebook使用与我能说的最佳机制相同的机制.
经过进一步研究,这似乎是OAuth在行动,并且看到我的API是基于.Net的,我想我应该使用DotNetOpenAuth并提供类似的机制.不幸的是,样本的文档很少(如果有的话),我在网上找到的唯一教程似乎专注于帮助您为用户提供登录机制,以便他们可以使用第三方提供商登录您的网站.
我真正想做的是让我的REST API处理我的Web应用程序的所有核心身份验证和业务逻辑,并且我的Web应用程序本质上是另一个仅通过OAuth使用API的应用程序.用户可以直接使用他们的用户名和密码在网站上进行身份验证,也可以通过第三方提供商(如MyOpenID或Facebook)进行身份验证,然后网站会以某种方式使用返回的令牌对REST API进行身份验证.

它基本上看起来我需要我的API以某种方式托管OAuth服务,但也让用户使用第三方OAuth服务.我不禁想到,我对OAuth没有足够的把握来决定我是否过于复杂化,或者我正在尝试做的事情是好事还是坏事.
有人能给我至少一个我需要采取的步骤的概述,或者我应该考虑做些什么来实现这一目标?或者指点一些教程?或者提出我的建议并告诉我,我(在架构上)这一切都是错的?
typeof(string).IsPrimitive == false
typeof(int).IsPrimitive == true
typeof(MyClass).IsClass == true
typeof(string).IsClass == true
typeof(string).IsByRef == false
typeof(MyClass).IsByRef == true // correction: should be false (see comments below)
Run Code Online (Sandbox Code Playgroud)
我有一个实例化T的新实例的方法,如果它是一个"复杂"类,则从一组源数据值中填充其属性.
(a)如果T是简单类型(例如字符串或int或其他类似的东西),则执行从源数据到T的快速转换.
(b)如果T是一个类(但不是像字符串这样简单的东西),那么我将使用Activator.CreateInstance并进行一些反射来填充字段.
是否有一种快速而简单的方法来判断我是否应该使用方法(a)或方法(b)?此逻辑将在通用方法中使用,其中T作为类型参数.
void Get<T>(Action<T> createObject)
{
T obj = createObject();
if(obj == default(T))
return obj;
// .. do a bunch of stuff
return obj;
}
Run Code Online (Sandbox Code Playgroud)
编译器错误:运算符'=='不能应用于'T'和'T'类型的操作数
我该怎么做呢?
在我的NLog配置中,我有一个全能记录器,但我创建的特定记录器非常垃圾,我希望它的输出转到它自己的文件.这一部分很简单,但是catch-all记录器也会收到垃圾邮件日志消息.如何告诉主记录器记录所有内容,但要排除垃圾记录器?
我正在使用NLog 2.0.
我喜欢我的对象初始化器看起来像这样:
new Point { Label = g.Key.Name, Claims = g };
Run Code Online (Sandbox Code Playgroud)
当按分号键时,它们会像这样重新格式化:
new Point {Label = g.Key.Name, Claims = g};
Run Code Online (Sandbox Code Playgroud)
阻止我的填充被删除的选项在哪里?
如何在不禁用自动完成的情况下完全禁用Sublime Text 3代码段功能?让编辑器"帮助"我使用蹩脚的预先键入的代码块只会减慢我的速度.我更喜欢它让我自己输入代码.
我正在尝试从构建服务器上的命令行使用NuGet包还原.
nuget install myapp/packages.config
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误消息:
默认情况下禁用包还原.要获得同意,请打开"Visual Studio选项"对话框.
如果不在构建服务器上安装VS2010 ,我该怎么办呢?(不,我不这样做).有注册表设置还是什么?NuGet如何确定禁用包恢复.实际上,为什么他们甚至会关心默认禁用?
我有一个非常胖的公用表表达式,其中包含行号,以便我可以返回分页结果集.我还希望在分页结果集之前返回与查询匹配的记录总数.
with recs as (select *, row_number() over (order by id) as rownum from ......)
select * from recs where rownum between @a and @b .... select count(*) from recs
Run Code Online (Sandbox Code Playgroud)
显然我上面的查询是不完整的,但它只是为了说明我的观点.我想要一页结果和匹配总数.如何在不必复制和粘贴整个20+线CTE的情况下完成此操作?
在这一点上,我真的非常沮丧.我有一个现有的hg存储库,里面有几个月的编码历史记录,我想把它变成一个私有的Github存储库,所以我可以从那里开始工作.不幸的是我使用Windows,我似乎无法找到任何方式来转换我实际上可以正常工作的存储库.实际上我在网上找到的每一点帮助和建议似乎都假设我是从某种类型的*nix shell运行的,我不是.
我目前已经安装了:TortoiseHG,Python 3.1和Git for Windows.
我尝试过的:
hg的hg-init插件 - 当我尝试使用gexport命令(以及来自hg-git的其他命令)时,我只获得了python异常的字符串.我完全不能得到git甚至认识到gremote命令.我尝试了以下内容:http://github.com/blog/439-hg-git-mercurial-plugin
hg-to-git(快速导出) - 所有教程都指望我运行.sh文件.另一个stackoverflow线程似乎暗示Powershell可以运行.sh文件,但是我不能让它在我的生命中运行它们.示例:http://hivelogic.com/articles/converting-from-mercurial-to-git
Mercurial转git转换器 - http://permalink.gmane.org/gmane.comp.version-control.git/36601 - 当我通过Python运行它时,我不想工作,因为它抱怨它有语法错误第44行.我不知道python,所以我不知道.
四个小时的谷歌搜索和浏览无用的教程和人 - 比我更幸运的是赞美每个据称有用的博客文章,但我没有得到任何关于此.任何人都可以为我提供任何帮助或建议吗?
c# ×3
.net ×2
generics ×2
algorithm ×1
api ×1
formatting ×1
git ×1
mercurial ×1
nlog ×1
nuget ×1
oauth ×1
openid ×1
python ×1
resharper ×1
rest ×1
sql-server ×1
string ×1
sublimetext ×1
sublimetext3 ×1
suffix-tree ×1
t-sql ×1
windows ×1