经过相当多的阅读后,我发现了后缀数组和LCP数组所代表的含义.
后缀数组:表示数组每个后缀的_lexicographic等级.
LCP数组:在按字典顺序排序后,包含两个连续后缀之间的最大长度前缀匹配.
几天以来,我一直在努力理解,后缀数组和LCP算法究竟是如何工作的.
这是代码,取自Codeforces:
/*
Suffix array O(n lg^2 n)
LCP table O(n)
*/
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define REP(i, n) for (int i = 0; i < (int)(n); ++i)
namespace SuffixArray
{
const int MAXN = 1 << 21;
char * S;
int N, gap;
int sa[MAXN], pos[MAXN], tmp[MAXN], lcp[MAXN];
bool sufCmp(int i, int j)
{
if (pos[i] != pos[j])
return pos[i] …
Run Code Online (Sandbox Code Playgroud) 给定两个排序的数字数组,我们希望找到具有第k个最大可能总和的对.(一对是第一个数组中的一个元素,第二个数组中是一个元素).例如,使用数组
具有最大总和的对是
因此,第四大总和是(13,8).如何找到具有第k个最大可能总和的对?
另外,最快的算法是什么?数组已经排序,大小为M和N.
我已经知道O(Klogk)解决方案,使用此处给出的Max-Heap .
它也是Google最喜欢的采访问题之一,他们需要一个O(k)解决方案.
我还在某处读到存在O(k)解决方案,我无法弄清楚.
有人可以用伪代码解释正确的解决方案.
PS请不要发布此链接作为答案/评论.它不包含答案.
来源:Google面试问题
编写例程以确保输入中的相同元素在输出中最大程度地分布?
基本上,我们需要以这样的方式放置相同的元素,使得TOTAL扩展尽可能最大.
例:
Input: {1,1,2,3,2,3}
Possible Output: {1,2,3,1,2,3}
Total dispersion = Difference between position of 1's + 2's + 3's = 4-1 + 5-2 + 6-3 = 9 .
Run Code Online (Sandbox Code Playgroud)
我不是在所有 肯定的是,如果有可用的this.Also最佳多项式时间算法,没有其他细节提供了除此之外的其他问题.
我的想法是,计算输入中每个元素的频率,然后将它们一次排列在输出中,每个不同的元素,直到所有频率都耗尽.
我不确定我的做法.
任何方法/想法的人.
来源:微软访谈问题
我们得到一个包含单词的文件.我们需要确定其中存在的所有Anagrams.
有人可以建议最优化的算法来做到这一点.
我知道的唯一方法是 排序所有单词,然后检查.
来源:Google面试问题
给定一个庞大的计算机网络,每个计算机保留访问过的URL的日志文件,找到前十个访问最多的URL.
有很多大<string (url) -> int (visits)> maps
.
计算 < string (url) -> int (sum of visits among all distributed maps)
并获得组合地图中的前十名.
主要约束:地图太大,无法通过网络传输.也不能直接使用MapReduce.
我现在遇到了很多这类问题,其中processiong需要在大型分布式系统上完成.我无法思考或找到合适的答案.
我所能想到的只是蛮力,它以某种或其他方式违反了给定的约束.
要了解同一垂直线是什么,我们需要先定义水平距离.如果两个节点具有相同的水平距离(HD),则它们位于同一垂直线上.HD的想法很简单.根的HD为0,右边缘(连接到右子树的边缘)被认为是+1水平距离而左边缘被认为是-1水平距离.例如,在下面的树中,节点4的HD为-2,节点2的HD为-1,5和6的HD为0,节点7的HD为+2.
例子:
1
/ \
2 3
/ \ / \
4 5 6 7
Run Code Online (Sandbox Code Playgroud)
树有5条垂直线
Vertical-Line-1只有一个节点4
Vertical-Line-2:只有一个节点2
Vertical-Line-3:有三个节点:1,5,6
Vertical-Line-4:只有一个节点3
Vertical-Line-5:只有一个节点7
现在为树
1
/ \
2 3
/ \ / \
4 5 6 7
/ \ / \
8 9 10 11
Run Code Online (Sandbox Code Playgroud)
对于上面的树,我们应该从顶部到底部以及从左到右的角度获得每个垂直级别的输出
8
4
2 9
1 5 6或1 6 5(因为6和5处于相同的垂直水平,同样的HD,顺序无关紧要)
3 10
7
11
一种方法是简单地创建一个HD的多图,并进行一个水平顺序遍历,并将值推送到相应的HD索引.按顺序进行此操作将保证我们从上到下垂直访问.然后打印节点形成最低HD到最高HD,满足我们从左到右的约束.
我已经读过某个地方,我们可以用更好的方式使用Doubly-Link List方法或者类似的东西.任何帮助人们?
这就是我要做的事情:
我有一个包含3列的文本文件:PID, X, Y
.
现在我的数据库中有两个表:
Table 1
包含4列: UID, PID, X, Y
Table 2
包含多个列,必需的列 UID, X, Y
我需要Table 2
使用相应的X和Y值进行更新.
我认为我们可以BULK INSERT
用于更新table 1
,然后是一些WHILE
循环或其他东西.
但我无法弄明白确切的事情.
来源:微软访谈问题
给定一个排序数组,其中每个元素出现两次,除了一次出现的单元,我们需要找到该元素.
现在标准的O(n)解决方案是执行列表的异或,它将返回未重复的元素(因为所有重复的元素都会被取消).
如果我们知道数组已经排序,是否有可能更快地解决这个问题?
algorithm ×9
performance ×4
math ×2
anagram ×1
arrays ×1
binary-tree ×1
c++ ×1
graph ×1
large-data ×1
sql ×1
sql-server ×1
suffix-array ×1
t-sql ×1