删除字符串数组中重复项的最佳算法

2023-11-25

今天在学校老师要求我们实现一个重复删除算法。没那么难,大家想出了下面的解决方案(伪代码):

for i from 1 to n - 1
    for j from i + 1 to n
        if v[i] == v[j] then remove(v, v[j])    // remove(from, what)
    next j
next i

该算法的计算复杂度为n(n-1)/2。 (我们在高中,我们还没有谈论过大O,但似乎是O(n^2))。这个解决方案看起来很丑陋,当然也很慢,所以我尝试编写更快的代码:

procedure binarySearch(vector, element, *position)
    // this procedure searches for element in vector, returning
    // true if found, false otherwise. *position will contain the
    // element's place (where it is or where it should be)
end procedure

----

// same type as v
vS = new array[n]

for i from 1 to n - 1
    if binarySearch(vS, v[i], &p) = true then
        remove(v, v[i])
    else
        add(vS, v[i], p)      // adds v[i] in position p of array vS
    end if
next i

这边走vS将包含我们已经传递的所有元素。如果元素v[i]位于此数组中,则它是重复项并被删除。二分查找的计算复杂度为log(n)对于主循环(第二个片段)是n。因此整个CC是n*log(n)如果我没错的话。

然后我又想到了使用二叉树,但又爱不释手。
基本上我的问题是:

  • 我的CC计算正确吗? (如果不是,为什么?)
  • 有没有更快的方法?

Thanks


最简单的解决方案是简单地对数组进行排序(如果您可以使用标准实现,则需要 O(n log n) 。否则请考虑进行简单的随机快速排序(代码甚至在维基百科上))。

然后再扫描一次。 在该扫描过程中,简单地消除连续的相同元素。

如果你想在 O(n) 内完成,你也可以使用包含你已经见过的元素的 HashSet。 只需在数组上迭代一次,对于每个元素检查它是否在您的 HashSet 中。

如果其中没有,请添加它。 如果它在那里,请将其从数组中删除。

请注意,这将需要一些额外的内存,并且散列将有一个恒定的因素影响您的运行时间。虽然时间复杂度更好,但一旦超过一定的数组大小,实际运行时间只会更快

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除字符串数组中重复项的最佳算法 的相关文章

随机推荐

  • 为什么 Java 8 中的 Cloneable 没有默认的 clone()

    CloneableJava 本质上是破碎的 具体来说 我对接口的最大问题是它需要一种不定义方法本身的方法行为 所以如果遍历一个Cloneable列表中您必须使用反射来访问其定义的行为 然而 在 Java 8 中 我们现在有了默认方法 现在我
  • 使用 docker-entrypoint-initdb.d 脚本初始化 PostgreSQL 容器

    我正在尝试创建一个 PostgreSQL 11 5 docker 容器 在此过程中 我想运行一个 SQL 脚本来创建必要的用户 表等 但是 每当容器启动时 我都会看到以下错误 The files belonging to this data
  • Web api 路由和 http post [重复]

    这个问题在这里已经有答案了 我正在使用 WEB API 2 构建一个 API 我有以下 API 控制器 RoutePrefix api account public class AccountController ApiController
  • 如何在 AddModelError 消息中包含链接?

    我想添加一个 ModelState 错误 如下所示 ModelState AddModelError Some message a href controller action click here a 但是 该链接不会进行编码 因此会像文
  • emacs 完成或 IntelliSense 与 Visual Studio 上相同

    Linux 上的 emacs 22 2 1 我正在使用 emacs 进行一些 C C 编程 我想知道 emacs 是否支持补全 Visual Studio 中的 IntelliSense 例如 在填充结构时 我希望在键入点运算符或箭头运算符
  • 如何在netbeans中运行node.js文件?

    在net beans中 我安装了node js插件 但是我的简单节点程序无法工作 我收到错误 这是我的示例代码 var http require http http createServer function req res res wri
  • C/C++中Lua函数的引用

    我有一个函数嵌套在一组表中相对较深 C C 中有没有一种方法可以获取对该函数的 引用 并在需要使用它时将其 和参数 推送到堆栈上 这就是参考系统是为了 函数调用r luaL ref L LUA REGISTRYINDEX 将值存储在注册表中
  • $q.all 和嵌套的 Promise

    有一个关于在 Angular 中使用 q 时同步嵌套 Promise 的问题 下面的代码能否确保等待整个 Promise 链 这意味着对返回承诺的服务的嵌套调用是否会在 q all 块中等待 var call1 service1 get s
  • 使用 QTextStream 以非阻塞方式读取 stdin

    使用 Qt 我尝试以非阻塞方式读取标准输入流的内容 当套接字收到一些新数据时 我使用 QSocketNotifier 来提醒我 通知程序的设置如下所示 QSocketNotifier pNot new QSocketNotifier STD
  • 如何在 Scala 中使用库的多个版本?

    我正在 Scala 中使用一个库 例如 A 它依赖于另一个库 例如 Z 的 x 11 版本 现在 我还使用一个库 B 它依赖于 Z 的 x 31 版本 这会导致编译错误 因为我们将有两个版本的库 Z 我如何在 scala 的 sbt 中同时
  • 捕获标准输出并仍然将其显示在控制台窗口中

    我正在生成一个在可见控制台窗口中运行的子进程 它是运行 MSBuild 的批处理文件 并且我希望将进程生成的输出显示在可见控制台窗口中 并捕获该输出所以我可以用代码处理它 我已经阅读了其他几个问题和处理 ProcessStartInfo R
  • 在这种情况下,为什么调用父类方法而不是子类方法?

    我有一个父类 A 和它的子类 B 两者都有doSomething具有不同类型参数的方法 Class A package Inheritance public class A public void doSomething Object st
  • 添加类后 jQuery 单击事件不起作用

    在我的 JSP 页面中我添加了一些链接 a class applicationdata href Organization Data a a class applicationdata href Business Units a a cla
  • 为什么“cat”不会附加到“file”连接?

    我运行了这两个代码块 期望得到相同的输出 cattest lt file cattest txt cat First thing file cattest cat Second thing file cattest append TRUE
  • Laravel 如果 id 相同则验证唯一

    我有一个表 模型 其中每个用户包含多个相册 有没有办法说这个专栏title应该是唯一的 但仅限于具有相同的行user id 例子 http pastebin com 8dvM4a1T 正如您在示例中看到的 id 为 2 的用户创建了 2 个
  • 使用 ssh 密钥进行 cron git 推送

    我为github帐户设置了ssh密钥 因此不必每次都输入密码 效果很好 这是我使用的脚本 bin bash git push origin master 但是当我使用 cron 运行它时 它不会使用我的 ssh 密钥 这是输出 Permis
  • 状态栏和导航栏上的 Google Now 渐变/阴影

    我正在尝试制作与 Google Now 类似的状态栏和导航栏渐变 图片参考 如下所示的矩形区域 在 Android Marshmallow 上尝试以下选项后
  • 删除 Javascript blob?

    我很难摆脱这些愚蠢的事情 我有几个处理大量媒体文件的 Chrome 应用程序 其中一个我能够使用一堆 删除 和一个window URL revokeObjectURL这最终阻止了他们在chrome blob internals 但这另一个似
  • 使用 python urllib2 在http标头中传递会话cookie?

    我正在尝试编写一个简单的脚本来登录维基百科并使用 Mediawiki api 在我的用户页面上执行一些操作 但是 我似乎从未通过第一个登录请求 从此页面 https en wikipedia org wiki Wikipedia Creat
  • 删除字符串数组中重复项的最佳算法

    今天在学校老师要求我们实现一个重复删除算法 没那么难 大家想出了下面的解决方案 伪代码 for i from 1 to n 1 for j from i 1 to n if v i v j then remove v v j remove