分类 技术 下的文章

电脑的鼠标被设计成使用食指(大拇指旁边的那个手指)完成大部分操作。默认情况下鼠标为右利手用户配置。打开电脑时,多数情况下你会使用食指完成点击动作。

事实上,许多左利手用户(俗称左撇子)习惯把鼠标放到键盘的左边,然后用中指进行单击操作。但这并不是左利手用户使用鼠标最好的方法。

这个简短的教程为想要正确地使用左手操作鼠标的用户而编写。它将会帮助左利手用户将鼠标设置成用食指点击鼠标主键的操作模式。

这个教程同样适用于右利手用户。如果鼠标为左利手用户设置,那么右利手用户可以使用这个教程将鼠标键切换回来。

好了,现在咱们开始吧,点击顶部右端面板中的齿轮按钮选择System Settings(系统设置)...

然后在系统设置选项中选择Mouse & Touchpad (鼠标和触摸板),打开后选择‘Right(右)’选项,这样就可以改变鼠标的主键以适应左利手用户。

改回左以适应右利手用户。改变将会在选择后立即生效。

就是这样了。现在左撇子用户可以将鼠标移到键盘左边,用左手的食指来正确地操作鼠标了。

使用愉快!


via: http://www.liberiangeek.net/2013/11/daily-ubuntu-tipsmake-the-mouse-left-handed-for-left-hand-users/

译者:Linchenguang 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

对于那些既有Windows电脑又有Ubuntu电脑但却只有一台打印机的用户,这篇博文向你展示如何在Windows中共享一个打印机,并允许Ubuntu使用它来打印。

几乎所有的打印机都默认支持Windows系统。许多打印机生产商都为Windows生产打印机,但为包括Ubuntu在内的Linux系统生产的并不多。所以,假如你有一台支持Windows的打印机,你可以在Windows机器上分享它,然后让其它系统来使用它来打印。

在几年之前,我遇到了这个问题,那时大多数打印机生产商不支持Linux系统。我有一台老式的只支持Windows和Mac OS X但却不支持Linux的打印机。(译注:除非是特别冷门的打印机,现在一般都可以在Linux进行打印操作了。在译者看来,本文的理由不成立,不过做法成立。)

我在我的Windows机器上安装了打印机驱动,然后它就可以很好的工作咯。我的Windows机器使用它来打印非常好,但是我的Ubuntu却无法使用它来打印,因为打印机并不支持LAN接口。

所以,我在Windows上共享该打印机,然后我的Ubuntu机器就可以使用合适的字体和风格进行打印咯。假如你也遇到类似的情景,你可以按照下面的指导来操作。

首先,登入Windows,右击你要共享的打印机,然后点击‘Printer properties(打印机属性)

接着,选择“Sharing(共享)”标签页,勾选‘Share this printer(共享这台打印机)’复选框来共享。记住共享打印机的名字,因为你要使用这个共享名来连接这台打印机。

最后,以管理员权限运行命令行终端,运行以下命令以便于文件和打印机可以通过防火墙实现共享。

netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=Yes

接着,登入Ubuntu中,选择顶部面板右边的齿轮,然后选择系统设置...

系统设置打开后,选择打印机,然后点击添加。当跳出来一个窗口让你选择设备时,选择‘Windows Printer via SAMBA(使用SAMBA的Windows打印机)’。

键入Windows电脑的IP地址或者主机名,后面接着键入共享的打印机名。你可能需要键入你的windows验证信息(用户名和密码)。点击浏览来验证你是否可以看到打印机,当你完成这些后,就可以点击下一步继续。

接着,选择打印机品牌和型号。假如你在列表中看不到特定的型号,选择一个最接近它的然后继续。

以上这些都搞定了之后,你的打印机就已安装好,可以使用喽。

好好享受吧!


via: http://www.liberiangeek.net/2013/11/daily-ubuntu-tips-print-from-shared-windows-printers/

译者:Linux-pdz 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出

你是否曾经想要从桌面搜索电影或电视剧,或者搜寻能够随时为你搜索这些东西的应用程序?这儿有一个应用可以满足你的需要。

VidMasta是一个免费的、跨平台的的应用,它将搜索、浏览、评论、观看和下载那些在线分享的视频和电视剧等功能融为一体。它可以运行在Linux、Windows和Mac OS X上。

特点

使用VidMasta,你可以做到以下这些:

  • 观看或下载任何格式的电影或电视剧
  • 支持的格式是:TV,DVD,720P,1080P。
  • 匿名链接并自动过滤不受信任的IP,可以使用代理,还可以使用加密连接。
  • 搜索算法可以为电影下载链接自动匹配最佳下载源
  • “流行电影”和“流行电视剧”选项可以显示并让你下载当前最流行的电影/电视剧
  • 下载电影字幕
  • 可设置每次搜素结果的个数
  • 设置下载的视频文件的扩展名
  • 自动按照受欢迎度为搜索结果排序
  • 可以听也可以阅读影视概要
  • 观看预告片
  • 查看上映时间和电影评价
  • 多线程搜索和下载
  • 能够侦测电影盒子设置
  • 可以和PeerBlock集成(这项功能只能在Windows2000,xp,Vista和Windows 7上使用)
  • 除了Java(版本为6或以上)外,不再需要额外的软件
  • 客户端可以自动更新

在Linux上安装VidMasta

在安装VidMasta之前,你应该在你的Linux桌面系统中安装最新版的Java。从这儿下载最新版。进入你下载的文件夹,使用下面的命令安装它:

sudo java -jar vidmasta-setup-16.7.jar

运行后,就会出现像下面这样的画面。点击下一步继续。

选择安装路径,点击下一步。

安装完成后,点击下一步。

设置快捷键。

最后,点击Done结束安装。

完成安装后,VidMasta会自动打开。下面是VidMasta的默认界面。

搜素电影&电视剧

搜索电影电视剧非常容易。在标题框里键入电影的名字,选择电影种类和电影格式,例如“任何”,“DVD”,“720HD”,“1080HD”等。然后敲击Enter键开始搜素。你还可以通过评价来过滤搜素结果。假如你不知道电影的名字,你可以在菜单栏里勾选“任何”。

例如我要搜索冒险类的清晰度为720HD并在在2012年的11月第一周的今天上映的电影。一旦你敲击搜索按钮,VidMasta就会从www.imdb.com网站抓取搜索结果,并显示你每次搜索的关键词。下面是输出的样例。

你还可以在下载之前观看预告片或者阅读电影概要。要看电影的概要?选择一个电影,右击它,点击阅读概要就可以咯。你也可以使用搜索结果下的按钮去阅读电影概要,观看预告片,下载或者观看整个电影

更重要的是你可以在下载一部电影之前先观看它的预告片。点击观看预告片按钮,预告片就会在一个新窗口中打开,像下面这样。

如果你喜欢这部电影,可以点击下载链接(下载链接1或者下载链接2)下载这部电影。

流行电影&流行电视剧

假如你不知道那些电影值得去看时。那么不用担心,VidMata有一个选项去显示当前流行的电影或电视剧。点击下面的流行电影或电视剧按钮去发现当前流行流行的电影或电视剧。

是不是很酷?

需要注意的是,若你不能下载最新的电影或电视剧时,也许是因为版权问题或者国家原因。

你也可以尝试一下安装最新版的Java并禁用掉屏蔽广告程序,再去播放或下载电影。

你是否对此很期待呢?赶紧把它下载下来安装到你的系统中,祝你使用愉快!


via: http://www.unixmen.com/vidmasta-desktop-application-searching-movies-tv-shows/

译者:Linux-pdz 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Recoll是一个Unix和Linux桌面的文本搜索工具。Recoll可以搜索文件名和文件内的关键字。

Recoll可以为你做到以下这些。

  • 它可以搜索任何格式的文件
  • 支持通配符
  • 可以依据文件的作者、类型、大小和格式等条件进行搜索
  • 可以搜索存储在任何位置的文件,例如文件、归档文件、邮件附件等
  • 支持桌面和网站集成
  • 具备火狐插件,可索引web页的历史
  • 点击一下搜索结果就可以在本地编辑器内打开或者显示文本预览
  • 它是免费的开源的,在GPL许可下发布

在Ubuntu/Linux Mint上安装Recoll

Recoll在Ubuntu仓库里可以找到。然而,最好添加Recoll的仓库以便安装最新版本。

使用以下命令添加Recoll仓库:

sudo add-apt-repository

使用命令更新软件列表:

sudo apt-get update

现在就可以使用下面的命令安装Recoll。

sudo apt-get install recoll

对于其它的发行版,可以去下载页面下载源代码并编译安装。

启动Recoll

Recoll可以从Dash或者菜单中启动。

第一次启动时,你需要索引整个home目录。依据你 home 目录里储存的东西的多少,需要的时间不等。按下Start indexing now按钮开始索引。

假如你想更多的自定义索引,可以调整索引配置和索引计划。要做到这一点,只需要点击一下Indexing configuration或者Indexing schedule链接。假如你要稍后再去配置,你可以在Preferences(首选项)菜单里配置这些选项。

一旦索引完成,你就可以搜索文件/文件夹了。结果将根据相关性展现,并显示匹配的一小部分内容。

配置

正如上面提到的,假如你想更多的控制索引的细节,你可以调节Recoll的索引功能。 在Recoll的工具中有两个配置项

  1. 索引配置
  2. 索引计划

让我们来看一下上面这两个的简短描述。

索引配置可以让你索引时决定包含哪些目录以及排除哪些目录。默认情况下索引时将包含整个home目录。你可以在这儿从索引中添加或移除目录。

你也可以定义web历史队列以及储存web页面的最大容量。

index schedule则是可以让制定一个计划以便于进行自动索引或者当你登陆系统后就进行实时索引。

Recoll支持两种索引计划:

Cron任务 - 决定什么时候开始运行以及写入Crontab键值。

以上这个屏幕截图中,Recoll的cron任务会在每天上午12点的时候执行。设置完cron任务后,点击enable键激活它就可以咯。

启动时实时索引 - 决定是否当你登陆入系统时进行实时索引。

激活这一选项,recoll的守护程序都会随系统启动。要注意的是这一选项只有在默认索引设置的情况下才可用。

基本搜索

现在你已经对Recoll了解的足够多了。是时候去搜索一下文件或者文件夹了。这个应用的美妙之处就在于它既可以搜索文件名还可以搜索文件内的关键词。

在Recoll的用户界面中,在顶部右边的搜索栏中键入要搜索的关键字,然后点击Search按钮。

如你在上图所见,精确相关的内容将会显示还能预览到一小部分内容。你可以点击Open按钮直接打开搜索到的文件,或者在打开它之前使用预览按钮预览它。

你还可以过滤搜索结果,使用分类例如媒体、消息、其它、演示文档、电子表格或者文本等。更重要的是,你还可以选择匹配任一项、全部项、文件名或者语言等的搜索结果。

高级搜索

点击菜单栏中的高级搜索图标或者前往Tools->Advanced Search。这将打开一个新的对话窗口。在这儿你可以附加更多的限制条件来进行搜索。例如我可以搜索文件内容里含有关键字“hp”以及文件名含有“storage”的文件。

这将找到并显示文件内含有关键字“hp”且文件名含有“storage”的文件。

Unity桌面以及网站集成

这个应用支持桌面集成以及网站集成。假如你要把它集成到你的Ubuntu的Unity桌面中去,你可以用下面的命令安装recoll-lens

sudo apt-get install recoll-lens

请注意,lens限制显示结果最多显示20条。假如你要显示更多数目的搜索结果,编辑rclsearch.py,修改“if actual\_results >= 20:”这一行就可以咯。

假如你使用火狐浏览器,要去搜索你每天访问的浏览历史,你可以使用这个火狐扩展。这个火狐扩展可以和Recoll一起工作去索引你全天浏览的网站。在安装完这个扩展之后,在Recoll的索引配置中从web历史标签页中激活它就可以咯。

所有的Linux都在他们的文件管理器中内建了搜索功能,以便于尽可能容易的搜索文件/文件夹。对于那些不满足于内置搜索功能并想寻找更高级文本搜索工具的人来说,Recoll是个值得一试的工具。我认为,这真是个容易使用且功能强大的工具,对基本搜索如此,对高级搜索也是如此.

欢呼吧!

如有问题,请参考我们的Q/A论坛 : http://ask.unixmen.com/


via: http://www.unixmen.com/recoll-text-searching-tool-linux-desktops/

译者:Linux-pdz 校对:jasminepeng

本文由 LCTT 原创翻译,Linux中国 荣誉推出

这两个开源办公套件产品很相似,然而某一个貌似已经开始具有轻微的领先优势……

Apache OpenOfficeLibreOffice都是OpenOffice.org的现代衍生产品。最近几年,几乎所有的Linux发行版都将LibreOffice作为它们的默认办公套件。然而,过去18个月来,OpenOffice作为Apache项目又重新回到了人们的视线,对于这两款全功能办公套件,现在,自由软件用户可以进行二选一咯~

然而即使是用户,在两种几乎一样的选择中做决定也会有困难。三年前,这哥儿俩分了家,三年时间,这对于软件开发来说是很长的一段时间,即使是这样,OpenOffice和LibreOffice之间的不同却刚刚开始显现。除去那些明显已经去掉的过时特性,单说功能集合与基本逻辑,自从OpenOffice.org时代以来,这两者都几乎没有什么大的改变。

纵观整个套件,只有个别应用里能发现一些新功能,主要集中在Writer的文字处理方面。其实,它们两者之间的大部分区别主要存在于更高的层面,例如对格式和字体的支持、对插件扩展的政策等,更多的不同,则体现在是否紧跟时代,以及对标准化接口的努力程度上。

具体各程序间的区别

LibreOffice和OpenOffice之间的程序大部分都是一样的。例如它俩的Draw,看起来完全没有区别;再如Impress,主要的区别就是LibreOffice的最新版支持使用Android设备控制幻灯片放映;除了幻灯片背景以外,两者其他方面没什么不同,都能很好的胜任日常使用,除非有特殊偏好,用户选择哪一款都可以;同样,在Calc电子制表软件中,两者最大的区别就是你可以在LibreOffice里创建数据表单。

即使在用户最常用的Writer程序中,两者的区别也很小。LibreOffice这边,编辑窗口的底部状态栏现在新包含了一个字词计数器,审阅标签也不再局限于某个单个点,现在可以附加在配图上,另外,LibreOffice终于解决了“脚注无法紧靠对应文本显示”的bug,除此以外,LibreOffice还添加了一个简易搜索栏,与web浏览器上的那种类似,同时,去掉了图形水平线的选项,这个功能过去十几年来几乎从没人用过。

格式与字体

一些更明显的区别体现在格式分类与字体支持上。例如,OpenOffice始终支持一些较老的保存格式,像AportisDoc(Palm版)和Pocket Word。另外,它也可以打开.docx格式的文件,但是无法像LibreOffice一样将文档保存为docx格式。

LibreOffice同样在字体支持方面占有优势。它对多语言和高级排版工艺始终有较好的支持,因此最新发布版本能够支持OpenType这样的现代字体首选格式。更重要的,通过“文件->属性->字体”,你能够将字体嵌入到文档中去,无需任何繁琐操作,就能确保字体的兼容性。

这样的特性使得LibreOffice在面对微软Office用户转换格式的时候,得到了决定性的1分。因为通常OpenOffice和LibreOffice都无法很好处理微软格式的文档,特别是那些又有文字表格又有图形对象再加上复杂格式的文档。因此,如果你要共享复杂一些的文档,例如宣传手册,最好使用PDF格式,而不是Open文档格式(ODF)。

然而,如果你确实需要转换一些本地或微软的文档,LibreOffice拥有一些决定性优势。它不仅能读写大多数微软文档,而且它对字体替换处理的很好,而这正是文档格式转换时要面临的一个主要问题。尽管其他问题仍有不少,例如在特性实现上有所不同,但LibreOffice在处理微软Office文档时确实应该是一个更可靠的选择。

对待插件扩展的政策

OpenOffice和LibreOffice两者都能很好的支持插件扩展,想要加强或替换某个特性的时候,用户只需要几分钟就能下载并安装完毕。大多数情况下,同一个扩展,在OpenOffice和LibreOffice上面都能工作的很好。

区别就在于,使用LibreOffice时,你无需亲自安装那些最流行的插件扩展。相反,LibreOffice已经帮你安装整合好了。例如,基本语法校验工具Lightproof、数据库汇总和打印工具ReportBuilder、演示文稿压缩工具PresentationMinimizer、博客用户喜欢的WikiPublisher、还有幻灯片配置工具PresentationConsole等等。

以上这些扩展在OpenOffice下同样可用。与前者不同的是,使用OpenOffice时,你首先需要知道有这些扩展,然后专门去找到它们,这样一来,很大程度上限制了新用户对很多功能的体验。因此,当OpenOffice在最近发布的版本中尝试努力提供更好用的现代模板和剪贴画时,这样的疏漏就成了一个非常严重的不足,特别是当它很容易弥补的时候,(更何况LibreOffice同时也提供了自家最新的模板和剪贴画)。

界面的更新换代

在OpenOffice.org属于Sun和Oracle的12年日子里,它的界面和许多的其它功能一样,几乎被丢在遗忘的角落。如今的结果就是,OpenOffice和LibreOffice作为套件产品,都各自拥有一整套优秀的功能,但是它们的界面却仍停留在上世纪90年代的水平。只有表面上的一些老旧界面被移除,其实大部分仍然亟待更新。

在最新的发布中,OpenOffice试图彻底更新自己的界面的努力主要集中在“边栏”上。这一特性,你可以通过“工具->选项->LibreOffice->高级”打开,它被标记为“试验性”的。

边栏是一组功能集合,主要用于用户手动格式化。这一特性便于用户应用样式,因为如果用户关注在文章逻辑上,很容易忽略编排的样式。然而,最好的是,它大大简化了格式化字符和段落的选项卡,例如所有应用程序中都有的边框选项卡,以及电子表格单元格中的“格式”选项卡。幸运的是,边栏还重新定义了菜单和样式对话框窗口的概念。

LibreOffice还拥有更多的“冒险创新精神”,例如,与边栏类似,Impress中的任务面板,摘要显示了大多数幻灯片设计步骤中要用到的选项卡名称。

在Writer编辑窗口中,LibreOffice的大部分界面已经完成改进,窗口底部的状态栏中,添加了一个字词计数器,原本负责管理和编辑模板的狭窄子菜单,如今也已被高端大气上档次的流线形按钮所取代。

更明显的,LibreOffice中的主文本框架被精减为四个边角的十字准线。同样的,页眉和页脚也默认改为不可见,要想找到它们,四个小直角标明了它们的边界位置,点击就可以出现。

不太成功的一点改进是LibreOffice中管理页眉页脚的编辑窗口中的选项卡。虽然这个选项卡事实上是为了便于手动调整格式,但是让人郁闷的是,当在新一页的第一行输入的时候,已经输入的一部分总是会自动隐藏起来。

尽管LibreOffice还重组了许多对话窗口的选项,但是这些努力远没有结束。有时,开发人员会让LibreOffice变成传统框架与现代极简艺术的混合体,看起来有些不伦不类,但是,至少LibreOffice正在尝试着解决长期搁置的界面问题,而这些,OpenOffice甚至都还没来得及意识到。

做出选择

如果文档不超过2到3页,一般用户可能会时常看看标题栏看自己用的是LibreOffice还是OpenOffice。然而,对于进阶用户而言,LibreOffice目前可能更有优势。优势并不算大,但是很明显。

这一优势的确很难被忽略。原因首先是,在LibreOffice已经确立了好几个月时间优势的情况下,OpenOffice却仍在专注于管理权和代码审计,这些工作也许有帮助,也有必要,但是普通用户更愿意看到他们对代码做出更多的改进工作。

其次,LibreOffice的开发人员大部分是Go-oo的前成员,这是OpenOffice.org的一个非官方分支,以“快速完善”为目标。当Apache OpenOffice项目组还在筹建中的时候,LibreOffice就已经吸引了全世界酷爱编程、热衷变革的天才们。

没有人做过准确的调查,但是我印象中,当OpenOffice.org社区分家的时候,大部分富于冒险创新精神的贡献者都选择了LibreOffice,同时,有一些半独立的文档小组,在谨慎地同时为两个项目工作。

其实,LibreOffice最重要的优势或许可以称之为“吸血许可证”。怎么个意思呢?就是OpenOffice的Apache许可证兼容LibreOffice的Lesser GNU通用公共许可证,但是LibreOffice的Less GNU通用公共许可证却不兼容OpenOffice的Apache许可证。换句话说,LibreOffice可以随意自由地从OpenOffice“借”代码,但是OpenOffice却根本无法从LibreOffice“借”到任何东西。严格地讲,如果想从LibreOffice“借”来某个功能,OpenOffice必须完全从头实现。

这一情况有可能会改变,尤其是当Apache OpenOffice比LibreOffice拥有更高的知名度的时候,然而LibreOffice的支持者们正在迅速扩张,它的社区非常活跃,短短3年间所做的要比OpenOffice.org十二年来做的还要多。

现在,除非你特别需要某个功能,使用OpenOffice还是LibreOffice几乎没有区别。但是,我断定,除非发生某些不可预料的事情,否则LibreOffice的优势将会越来越大。无论你选择支持哪一方,几年内,也许你会对它重新作出评价。


via: http://www.datamation.com/applications/apache-openoffice-vs.-libreoffice-1.html

译者:Mr小眼儿 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

本文来源于一篇stackexchange的问题回答。提问者问到,我们在计算机科学和数学课程里面学习到的那些算法,到底在什么地方用到了?结果Vijay D给出一个洋洋洒洒的深入回答,得到了提问者和众多围观。我们将这篇回答翻译过来以飨读者。

Vijay D写到:

在我看来,一个系统背后主要发挥作用的算法更容易在非算法课程上找到,这和应用数学中的成果比理论数学中更容易出现在应用中是一个道理。在讲座中,很少有实际问题能够精确匹配到一个抽象问题。归根结底,我认为没有理由让流行的算法课程,诸如Strassen乘法,AKS素性测试、或者Moser-Tardos算法与底层实际问题,如实现视频数据库、优化的编译器、操作系统、网络拥堵控制系统或者其他系统相关。这些课程的价值是学习利用错综复杂的方法发现问题的脉络而找出有效的解决方案。高级算法和简单算法的分析都不简单。正是由于这个原因,我不会忽略简单随机算法或者PageRank。

我想你可以选择任何一个大型软件,并在内部找到它所采用的基础和高级的算法。作为一个研究案例,我选择了Linux内核,并会示例一些Chromium里面的例子。

Linux内核中的基本数据结构和算法

Linux内核(源代码的链接在github)。

1.链表双向链表无锁链表

2.B+ 树,这是一些你无法在教科书上找到的说明。

一个相对简单的B+树的实现。我把它作为一个学习练习来帮助理解B+树是如何工作的。这同样也被证明是有用的。

...

一个在教科书中并不常见的技巧。最小的值在右侧而不是在左侧。所有在一个节点里用到的槽都在左侧,所有没有用到的槽包含了空值(NUL)。大多数操作只简单地遍历所有的槽一次并在第一个空值时(NUL)终止。

3.优先排序列表 用于 互斥量驱动等等。

4.红黑树用于调度、虚拟内存管理、追踪文件描述符和目录项等。

5.区间树

6.根树用于内存管理,NFS相关查询和网络相关功能。

根树的一个通用的用处是存储指针到结构页中。

7.优先级堆,如其名称的教科书实现,用于cgroup

《简单的基于CLR的只插入的,含有指针的定长优先级堆》第七章

8.哈希函数,参考了Knuth和一篇论文。

Knuth建议,用乘法哈希的机器字来表示接近黄金比例的素数的最大整数。Chuck Lever验证了该技术的有效性:

http://www.citi.umich.edu/techreports/reports/citi-tr-00-1.pdf

这些素数的选择是位稀疏的,他们可以通过移位和加法操作,而不必使用乘法器,乘法器是很慢的。

9.有的代码,比如这个驱动,实现了他们自己的哈希函数。

使用了一种旋转哈希算法的哈希函数

Knuth, D. 《计算机程序设计艺术, 卷 3: 排序与搜索》, 第6、7章. Addison Wesley, 1973

10.哈希表用于实现inode文件系统完整性检测等等。

11.位数组用于处理标志位、中断等等。并在Knuth那本书的卷4中阐述。

12.信号量自旋锁

13.二分查找用于中断处理,寄存器缓存查询等等。

14.B树的二分查找

15.深度优先搜索被广泛地用于目录配置中

执行一个修改过的命名空间树的深度优先遍历,以指定的start\_handle节点开始(及结束)。回调函数会在任何一个参数匹配的节点被发现时被调用。如果回调函数返回了一个非0值,搜索将会立即终止并且将其返回给调用者。

16.广度优先搜索用于检测运行时锁定的正确性。

17.链表中的归并排序用于垃圾收集文件系统管理等等。

18.冒泡排序在一个驱动库中也有一个令人惊讶的实现。

19.Knuth-Morris-Pratt 字符串匹配,

根据Knuth、Morris和Pratt[1]实现了一个线性时间的字符串匹配算法。他们的算法避免了转换函数的显式地计算DELTA。对于长度为n的文本,其匹配时间是O(n),对于长度为m的模式(pattern),仅使用一个辅助函数PI[1 . .m],预先计算模式的时间为O(m)。数组PI允许转换函数DELTA被实时有效地计算。粗略地说,对于任何状态"q"= 0,1,…、m和在SIGMA中的任何字符"a",PI["q"]的值包含的信息是独立的"a"并需要计算DELTA("q","a") [2]。既然PI只有m个记录,而DELTA有O(m |SIGMA|)个记录,在预处理时间计算PI而不是DELTA的时候,我们可以节省一个因数|SIGMA|

[1] Cormen, Leiserson, Rivest, Stein,算法介绍,第二版,MIT出版社

[2] 见有限自动机原理

20.Boyer-Moore 模式匹配是在找替代品时的参考和建议。

实现了Boyer-Moore字符串匹配算法:

[1] 《一个快速的字符串搜索算法》,R.S. Boyer and Moore.计算机通信协会,20(10), 1977, pp. 762-772. http://www.cs.utexas.edu/users/moore/publications/fstrpos.pdf

[2] 《准确的字符串匹配算法手册》,Thierry Lecroq, 2004 http://www-igm.univ-mlv.fr/~lecroq/string/string.pdf

注:由于Boyer-Moore(BM)从右到左搜索匹配,仍然有可能匹配分布在多个块,在这种情况下该算法并没有优势。

如果你希望确保这样的事情永远不会发生,那使用Knuth-Pratt-Morris(KMP)实现。总之,根据您的设置适当地选择字符串搜索算法。

如果你正在用文本搜索器进行过滤,NIDS或任何类似的注重安全的目的,那么使用KMP。否则,如果你真的关心性能,并且你对数据包进行分类以使用服务质量(QoS)政策,当你不介意匹配可能分布分散,那么用BM。

Chromium 浏览器中的数据结构和算法

Chromium的(源代码在 Google code)。我只会列出一部分。我建议使用搜索来找到你最喜欢的算法或者数据结构。

1.伸展树

这个树通过分配策略(分配器)参数化。这个策略用于C的可用存储区的列表分配,参见zone.h。

2.Voronoi算法用于一个示例。

3.基于Bresenham算法的选项卡

在Chromium的第三方代码里面也有如下的数据结构和算法。

1.二叉树

2.红黑树

Julian Walker的总结

红黑树是一个有趣的小东西。他们被认为比AVL树(它们的直接竞争对手)简单,乍一看这似乎是由于插入是一项轻松的乐事。然而,当你开始删除时,红黑树变得非常棘手。然而,通过复杂性的平衡,插入和删除可以使用单通道,实现自上而下的算法。这与AVL树情况不一样,插入只能自顶向下,删除则需要自下而上。

...

红黑树是很流行的,像大多数数据结构一样有一个古怪的名字。比如,在Java和c++库映射结构通常用红黑树实现。红黑树的速度也与AVL树相当。而AVL树平衡性不是很好,需要保持平衡的话红黑树通常更好。有一些流传的误解,但在大多数情况下对红黑树的宣传是准确的。

3.AVL 树

4.Rabin-Karp字符串匹配用于比较。

5.自动机后缀的计算

6.由Apple公司实现的bloom过滤器

7.Bresenham 算法

编程语言库

我想这个问题值得思考。编程语言设计者们认为值得花一些工程师的时间和精力来实现这些数据结构和算法,这样其他人就不必这么做了。这些库是我们在JAVA里面比C更少的发现需要重新实现基本数据结构的部分原因。

1.C++ STL包含了链表、栈、队列、映射、向量和排序搜索和堆操作算法。

2.Java API易于扩展的并且越来越多。

3.Boost C++ 库包含了像 Boyer-Moore以及Knuth-Morris-Pratt字符串匹配算法。

分配和调度算法

我发现这些很有趣,因为即使他们被称为启发式,您使用的策略规定了算法类型和需要的数据结构,因此,所以需要人们知道栈和队列。

1.最近最少使用(LRU)算法可以用不同的方法实现。Linux内核有一种基于列表的实现

2.其他的还有先入先出(FIFO)、最常使用和轮询。

3.FIFO的一个变种用于VAX/VMS系统。

4.Richard Carr时钟算法用于Linux中的页面替换。

5.Intel i860处理器是一种随机替代策略。

6.自适应置换高速缓存用于一些IBM存储控制器中,也曾经用于PostgreSQL中(虽然仅仅因为一些专利问题)。

7.Knuth在《计算机程序设计艺术 卷1》中讨论过的Buddy内存分配算法内用于Linux内核中,jemalloc并发分配器被用于FreeBSD和facebook中。

*nix系统核心工具

1.grepawk同时从正则表达式中实现NFA的Thompson-McNaughton-Yamada构造,显然这甚至击败了Perl的实现

2.tsort实现了拓扑排序。

3.fgrep实现了Aho-Corasick字符串匹配算法

4.GNU grep,根据作者Mike Haertel实现了Boyer-Mooresuan算法

5.Unix上的crypt(1)实现了一个在Enigma机器上的不同加密算法。

6.Unix diff由Doug McIllroy实现,基于和James Hunt合作编写的原形。它比用于计算Levenshtein距离的标准动态规划算法执行地更好。Linux 版本计算最短编辑距离。

加密算法

这本是一个非常长的列表。加密算法在所有执行安全通信和交易的程序中都有实现。

1.Merkle 树,特别是 Tiger Tree Hash变种,被用于点对点应用,比如GTK GnutellaLimeWire

2.MD5被用于提供软件包的校验和并被用于在*nix系统上的完整性检测(Linux 实现),同样也支持Windows和OSX。

3.OpenSSL实现了很多加密算法包括AES、Blowfish、DES、SHA-1、SHA-2、RSA、DES等等。

编译器

1.LALR 解析在yacc和bison实现。

2.支配算法被用于大多数基于SSA形式的编译器优化。

3.lex和flex将正则表达式编译为NFA。

压缩和图像处理

1.用于GIF图片格式的Lempel-Ziv算法在图像处理程序中实现,从*unix工具转化到复杂的程序。

2.行程长度编码用于产生PCX文件(用于原来的画笔程序),它是被压缩的BMP和TIFF文件。

3.小波压缩是JPEG2000的基础,所以所有生成JPEG2000文件的数码相机会支持这个算法。

4.Reed-Solomon纠错在Linux内核、CD驱动器、条形码读取器、结合从Voyager中的卷积图像传输中实现。

冲突驱动语句学习算法 (CDCL)

自2000年以来,SAT求解器在工业标准的运行时间(通常是硬件工业,虽然其他地方也被使用)以近乎指数的方式每年下跌。这发展中很重要的一部分是冲突驱动语句学习算法,它结合了Davis Logemann和Loveland在约束规划和人工智能研究中关于语句学习的原始论文中的布尔约束传播算法。特定地,工业造型,SAT被认为是一个简单的问题(见这个讨论)。对我而言,这个一个最近最好的成功故事,因为它结合了这几年算法的不断发展、清晰的工程理念、实验性的评估、齐心协力地解决一个问题。Malik 和 Zhang的CACM文章值得阅读。这个算法在许多大学中教授(我参加过的4个地方都是如此),但是通常在一个逻辑或者形式方法课上。

SAT求解器的应用有很多。IBM,Intel和许多其他公司都有他们的SAT求解器实现。OpenSuse的包管理器同样使用了一个SAT求解器。


via: http://cstheory.stackexchange.com/questions/19759/core-algorithms-deployed/19773#19773

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出