一些常见的字符串匹配算法
字符串匹配在文本处理的广泛领域中是一个非常重要的主题。字符串匹配包括在文本中找到一个,或者更一般地说
2023-04-25作者:京东零售李文涛
一、简介1.1 Background字符串匹配在文本处理的广泛领域中是一个非常重要的主题。字符串匹配包括在文本中找到一个,或者更一般地说,所有字符串(通常来讲称其为模式)的出现。该模式表示为p=p[0..m-1];它的长度等于m。文本表示为t=t[0..n-1],它的长度等于n。两个字符串都建立在一个有限的字符集上。
一个比较常见的字符串匹配方法工作原理如下。在一个大小通常等于m的窗口帮助下扫描文本。首先将窗口和文本的左端对齐,然后将窗口的字符与文本中的字符进行比较,这一特定的工作被称为尝试,在完全匹配或不匹配之后,将窗口移到右侧。继续重复同样的过程,直到窗口的右端超过文本的右端,一般称为滑动窗口机制。
(相关资料图)
BF算法检查文本中0到n-m之间的所有位置,是否有模式从那里开始出现。然后,在每次尝试之后,它将模式串向右移动一个位置。
BF算法不需要预处理阶段,除了模式和文本之外,还需要一个恒定的额外空间。在搜索阶段,文本字符比较可以以任何顺序进行。该搜索阶段的时间复杂度为O(mn)。
public static int strMatch(String s, String p){ int i = 0, j = 0; while(i < s.length() && j < p.length()){ if(s.charAt(i) == p.charAt(j)){ i++; j++; }else{ i = i - j + 1; j = 0; } if (j == p.length()){ return i - j; } } return -1;}
二、KMP先回顾下brute force中匹配的情况。我们在文本串BBC#ABCDAB$ABCDABCDABDE中查找模式串ABCDABD,文本串中第1个字符“B”与模式串中第1个字符“A”不匹配,所以我们将模式传后移一位。
文本串中的第2个字符“B”和模式串中的第一个字符“A”不匹配,继续后移。
基于这种方式不断比较并且移动,我们发现文本串中的第5个字符“A”和模式串中的第1个字符“A”是匹配的,那么继续比较文本串和模式串的下一个字符。
不断比较之后我们发现,文本串中的字符“$”和模式串中的最后一个字符“D”不匹配。
根据BF算法,我们应该继续将模式串向后移动一位,然后从头开始重新比较。
那我们不妨观察下,上次匹配失败的情况,当文本串中“$”与模式串中“D”不匹配时,我们其实已经完成了6次匹配,也就是说我们在文本串和模式串中已经找到了"ABCDAB"。同时我们可以发现模式串中前缀“AB”是可以和文本串中已匹配成功部分的后缀“AB”相匹配,我们利用这个信息,可以把模式串右移多位,而不仅仅是1位来去继续匹配(换句话说,我们不需要回退文本串的搜索位置),这加快了搜索速率。
同样的,当搜索到下面情况时,文本串中的字符“C”和模式串中的字符“D”不匹配,利用已知的信息,我们右移模式串,不回退搜索位置,继续去查找匹配。
最终,查找成功。
简单来说,文本串和模式串匹配失败时,kmp算法并没有像bf算法描述中一样,将模式串右移1位,从头重新进行搜索,而是利用已匹配信息,不回退文本串的搜索位置,继续将模式串向后移动,减少比较次数,提高了效率。那么当匹配失败时,模式串究竟要向后移动多少位呢?
2.1 前缀函数前缀是指从串首开始到某个位置结束的一个特殊子串。字符串S以i结尾的前缀表示为Prefix(S,i),也就是Prefix(S,i)=S[0..i]。
真前缀指除了S本身的S的前缀。
后缀是指从某个位置开始到整个串末尾结束的一个特殊子串。字符串S的从i开头的后缀表示为Suffix(S,i),也就是Suffix(S,i)=S[i..|S|-1]。
真后缀指除了S本身的S的后缀。
回到上文kmp算法匹配流程中,当文本串和模式串匹配失败时,我们右移模式串的位数是多少呢?或者说,当文本串中字符与模式串中字符匹配失败时,应该重新跟模式串中哪个字符再进行匹配呢?
上面的例子文本串中$与模式串中D匹配失败,而由于已经匹配成功了“ABCDAB”这6个字符,我们发现可以将模式串右移4位再进行比较,或者说此时,当匹配至模式串第7个字符失败后,可以重新和模式串的第3个字符,也就是“C”进行比较,这是由于文本串中的“AB”恰好和模式串中的前缀“AB”相匹配。而且我们发现匹配失败前文本串中的“AB”和已匹配的模式串中的后缀“AB”也是相匹配的。所以实际上我们根据模式串自身的特点,就能知道匹配失败时如何去匹配新的位置。
我们定义数组prefix,其中prefix[i]表示以S.charAt(i)为结尾的即S[0..i]中最长的相同真前后缀的长度。以字符串“aabaaab”为例:
i=0时,子串“a”无真前后缀,prefix[0]=0
i=1时,子串“aa”,其中[a]a和a[a]最长的相同真前后缀为a,prefix[1]=1
i=2时,子串“aab”无相同的真前后缀,prefix[2]=0
i=3时,子串“aaba”,其中[a]aba aab[a]最长的相同真前后缀为a,prefix[3]=1
i=4时,子串“aabaa”,其中 [aa]baa aab[aa] 最长的相同真前后缀为aa,prefix[4]=2
i=5时,子串“aabaaa”,其中[aa]baaa aaba[aa] 最长的相同真前后缀为aa,prefix[5]=2
i=6时,子串“aabaaab”,其中[aab]aaab aaba[aab]最长的相同真前后缀为aab,prefix[6]=3
上文匹配的prefix数组如下:
如何求解prefix呢,很容易想到一种方法是,我们使用两个for循环来遍历给定字符串的前缀中的真前缀和真后缀,内部去比较真前缀和真后缀是否相同。即便我们从最长的真前后缀来尝试匹配,这个方法的时间复杂度还是很高。
public static int[] getPrefix(String str){ int[] res = new int[str.length()]; for(int i = 1; i < res.length; ++i){ for(int j = i; j > 0; --j){ if (str.substring(0, j).equals(str.substring(i-j+1,i+1))){ res[i] = j; break; } } } return res; }
2.2 第一个优化我们观察下由s[i]至s[i+1]求解最长的真前后缀匹配情况变化。
// compute "ABCDA" -> compute "ABCDAB"// A A <-"ABCDA"时最长前缀、后缀匹配// AB DA// ABC CDA// ABCD BCDA// ->// A B// AB AB <-"ABCDAB"时最长前缀、后缀匹配// ABC DAB// ABCD CDAB// ABCDA BCDAB// compute "ABCDA" -> compute "ABCDAP"// A A <-"ABCDA"时最长前缀、后缀匹配// AB DA// ABC CDA// ABCD BCDA// ->// A P// AB AP// ABC DAP// ABCD CDAP// ABCDA BCDAP// 无匹配// A->AB// 也就是说最好的情况下,以s[i]为结尾的最长的相同的真前后缀长度,一定是以s[i-1]为结尾的最大的相同的真前后缀相同的长度+1
根据上面的描述,在尝试匹配真前后缀的时候,我们可以减少循环次数。
public static int[] getPrefix1(String str){ int[] prefix = new int[str.length()]; prefix[0] = 0; for (int i = 1; i < str.length(); ++i){ for(int j = prefix[i-1] + 1; j > 0; --j){ if (str.substring(0, j).equals(str.substring(i-j+1, i+1))){ prefix[i] = j; break; } } } return prefix;}
考虑一种情况,计算字符串“baabaab”的prefix的时候,在计算i=5的时候,我们已经完成了“baa”的比较,当计算i=6的时候,我们比较前缀“baab”和后缀“baab”,但是在上一次比较,我们知道前缀“baa”和后缀“baa”已经匹配了。
为了减少这种重复的匹配,我们考虑一下利用双指针来不断的去比较所指的两个字符
// if(s.charAt(i) == s.charAt(j))// prefix[i] = prefix[j-1] + 1;// or// prefix[i] = j + 1;// }
具体实现如下:
public static int[] getPrefix2(String str){ int[] prefix = new int[str.length()]; int j = 0; int i = 1; while(i < str.length()){ if (str.charAt(j) == str.charAt(i)){ j++; prefix[i] = j; i++; }else{ // 匹配失败时, while(j > 0 && !str.substring(0, j).equals(str.substring(i-j+1, i+1))){ j--; } prefix[i] = j; i++; } } return prefix;}
2.3 第二个优化上面的优化是针对匹配成功时候的情况,那么匹配失败时,难道真的需要重新去枚举其他的真前后缀,来去不断的尝试匹配吗?我们观察下,匹配失败时,能否利用前面已经计算完的结果呢?
当s[j]!=s[i]的时候,我们是知道s[0..j-1]和s[i-j..i-1]是相同的,到这里再回想一下prefix数组的定义,prefix[j-1]表示的是以s.charAt(j-1)字符为结尾的即s[0..j-1]中最长的相同真前后缀的长度,如果prefix[j-1]=x(x!=0),我们很容易得到s[0..x-1]和s[j-x..j-1]是相同的。
再将s[i-j..i-1]展开来看一下,因为我们知道s[0..j-1]和s[i-j..i-1]是相同的,所以s[i-j..i-1]也同样存在相同的真前后缀,即真前缀s[i-j-x..i-j]以及真后缀s[i-x..i-1],而且由于s[0..x-1]和s[j-x..j-1]是相同的,s[j-x..j-1]和s[i-x..i-1]是相同的(整体相同,对应的部分也是相同的),可以容易得到s[0..x-1]和s[i-x..i-1]是相同的。
再回到原始的字符串上来观察,s[0..x-1]正是字符串s的真前缀,而s[i-x..i-1]是以i-1为结尾的真后缀,由于这两部分相同,我们更新j=x=prefix[j-1],准确找到已经匹配的部分,继续完成后续的匹配即可。
代码实现如下:
public static int[] getPrefix4(String str){ int[] prefix = new int[str.length()]; int j = 0; int i = 1; while(i < str.length()){ if (str.charAt(j) == str.charAt(i)){ // 更新j,同时j++也正是已匹配的最大长度 j++; prefix[i] = j; i++; }else if(j == 0){ // 当str.charAt(j) != str.charAt(i) && j == 0时,后移i即可 i++; }else{ // 找到已匹配的部分,继续匹配即可 j = prefix[j-1]; } } return prefix;}
2.4 求解next很多kmp算法的讲解都提到了next数组,那么实际上next数组求解和上面的prefix求解本质是一样的,next[i]实际上就是以i-1为结尾的最长的相同真前后缀的长度。
定义next[j]为当s[i] != p[j]时,需要跳转匹配的模式串的索引,特别的当next[0] = -1
public static int[] getNext(String str){ int[] next = new int[str.length()+1]; int i = 1; int j = 0; // next[0] = -1 指代匹配失败,更新文本串索引+1 next[0] = -1; while(i < str.length()){ if (j == -1 || str.charAt(i) == str.charAt(j)){ i++; j++; next[i] = j; }else{ j = next[j]; } } return next;}
2.5 完整代码public static int search(String s, String p){ int[] next = getNext(p); int i = 0, j = 0; while(i < s.length() && j < p.length()){ if (j == -1 || s.charAt(i) == p.charAt(j)){ i++; j++; }else{ j = next[j]; } if (j == p.length()){ return i - j; } } return -1;}
2.6 优化next以上面的next数组为例,当i=5,匹配失败时,应该跳转i=1进行比较,但是我们知道s[5]=s[1]="B",这样匹配下去也是必定会失败的,基于这一点,还可以简单优化下next数组的求解过程。
public static int[] getNext1(String str){ int[] next = new int[str.length()+1]; int i = 1; int j = 0; next[0] = -1; while(i < str.length()){ if (j == -1 || str.charAt(i) == str.charAt(j)){ i++; j++; if (i < str.length() && str.charAt(i) != str.charAt(j)){ next[i] = j; }else{ // 如果相同,根据next[j]跳转即可 next[i] = next[j]; } }else{ j = next[j]; } } return next;}
三、其他算法这一部分,介绍几种其他字符串搜索的算法
3.1 BM1977 年,德克萨斯大学的 Robert S.Boyer 教授和 J StrotherMoore 教授发明了一种新的字符串匹配算法:Boyer-Moore算法,简称BM 算法。BM算法的基本思想是通过后缀匹配获得比前缀匹配更多的信息来实现更快的字符跳转。
通常我们都是从左至右去匹配文本串和模式串的,下面我们从右至左尝试匹配并观察下。文本串中的字符“S”,在模式串中未出现,那么我们是不是可以跳过多余的匹配,不用去考虑模式串从文本串中第1个、第2个、第m个字符进行匹配了。可以直接将模式串向后滑动m个字符进行匹配。
继续观察下面匹配失败的情况,我们可以发现,模式串后三个字符“E”、“L”、“P”一定无法和文本串中的字符“M”进行匹配。换句话说,直到移动到模式串中最右边的“M”(如果存在的话)之前,都是无法匹配成功的。基于这个观察,我们可以直接向后移动模式串,使最右边出现的“M”和文本串中的“M”对齐,再去继续匹配。
总结:1.当出现失配字符时(文本串的字符),如果模式串不存在该字符,则将模式串右移至失配字符的右边。
2.如果模式串中存在该字符,将模式串中该字符在最右边的位置,和文本串的失配字符对齐。
我们再观察下面的情况,我们发现文本串中字符“A”和模式串中的字符“B”匹配失败,此时已匹配的后缀“AB”我们可以在模式串中找到同样的子串“AB”,我们完全可以向后移动模式串,将两个串中的“AB”来对齐,再继续匹配。
再观察下面这种情况,已经匹配的后缀“CBAB”我们无法在模式串中找到同样的部分,难道就没有办法加快匹配了吗?我们以匹配的字符串“CBAB”中的几个真后缀“BAB”、“AB”、“B”,其中“AB”作为前缀出现在了模式串中,那我们可以后移模式串,将文本串中的后缀“AB”和模式串中的前缀“AB”对齐,从而继续进行匹配。
为什么已匹配的字符的真后缀必须要和模式串中的前缀匹配才可以移动呢?我们可以看下面这个例子。已匹配的“CBAB”中的真后缀“AB”,在模式串中是存在的(非前缀),那我们向后移动模式串把这两部分对齐继续匹配如何呢?这样做看似合理,但实际上却是一个无效的匹配位置。很明显,因为文本串中“AB”前的字符和模式串中“AB”前的字符一定是不匹配的,否则我们是可以找到一个比“AB”更长的匹配,且这个匹配的一定是模式串中的前缀,这就符合我们上面说的情况了。所以当没有能够匹配上合理后缀这种情况出现时,正确的移动是将模式串向后移动m位。
总结:1.当模式串中有子串和已匹配后缀完全相同,则将最靠右的那个子串移动到后缀的位置继续进行匹配。
2.如果不存在和已匹配后缀完全匹配的子串,则在已匹配后缀中找到最长的真后缀,且是模式串的前缀(t[m-s…m]=P[0…s])
3.如果完全不存在和好后缀匹配的子串,则右移整个模式串。
BM算法在实际匹配时,考虑上面两种策略,当匹配失败发生时,会选择能够移动的最大的距离,来去移动模式串,从而加速匹配。实际情况,失配字符移动策略已经能很好的加速匹配过程,因为模式串本身字符数量是要少于文本串的,Quick Search algorithm(Sunday)正是利用这一策略的算法(有些许不同),或者说是一种简化版的BM算法。
3.2 SundaySunday 算法是 Daniel M.Sunday 于 1990 年提出的字符串模式匹配。其效率在匹配随机的字符串时比其他匹配算法还要更快。Sunday 算法的实现可比 KMP,BM 的实现容易的多。
Sunday算法思想跟BM算法很相似,在匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符。如果该字符没有在模式串中出现则直接跳过,即移动步长= 模式串长度+1;否则,同BM算法一样其移动步长=模式串中最右端的该字符到末尾的距离+1。
文本串T中字符“c”和模式串中的字符“d”不匹配。我们观察文本串参与匹配的末位的下一个字符“e”,可以知道“e”没有出现在模式串中。于是移动模式串长度+1。
继续匹配,我们发现文本串T中字符“a”和模式串中的字符“d”不匹配。我们观察文本串参与匹配的末位的下一个字符“a”,可以知道“a”出现在模式串中(最右的位置)。于是移动模式串该字符到末尾的距离+1。
3.3 Rabin-KarpRabin-Karp 算法,由 Richard M. Karp 和 Michael O. Rabin 在 1987 年发表,它也是用来解决多模式串匹配问题的。该算法实现方式与上述的字符匹配不同,首先是计算两个字符串的哈希值,然后通过比较这两个哈希值的大小来判断是否出现匹配。
为了帮助更好的解决字符串匹配问题,哈希函数应该具有以下属性:
1.高效的、可计算的
2.更好的识别字符串
3.在计算hash(y[j+1 ..j+m])应该可以容易的从hash(y[j..j+m-1])和y[j+m]中得到结果,即hash(y[j+1 ..j+m])=rehash(y[j],y[j+m],hash(y[j..j+m-1])
我们定义hash函数如下:
hash(w[0 ..m-1])=(w[0]*2m-1+w[1]*2m-2+···+w[m-1]*2^0) mod q
由于计算的hash值可能会很大,所以需要取模操作,q最好选取一个比较大的数,且是一个质数,w[i]表示y[i]对应的ASCII码。
hash(w[1..m])=rehash(w[0],w[m],hash(w[0..m-1]))
rehash(a,b,h)= ((h-a*2^m-1)*2+b) mod q
匹配过程中,不断滑动窗口来计算文本串的hash值和模式串的是否相同,当出现相同时,还需要再检查一遍字符串是否真正相同,因为会出现哈希碰撞的情况。
3.4 Shift-and/orShift-and算法的总体思路是把模式串预处理成一种特殊编码形式,然后根据这种编码形式去逐位匹配文本串。
首先对模式串进行预处理,利用二进制数位进行编码。如果模式串为“abac”,a出现在第0位和第2位,那么则可以保存a的信息为5(二进制为0101),同样的,我们把模式串出现的所有字符均用这种方式编码,并保存起来。
对于每一位文本串字符,我们定义一个对应的状态码数字P,当P[i]=1时,则表示以这一位文本串为末尾时,能和模式串的第0位到第i位的字符能完全匹配。我们看一下具体的匹配过程。
文本串“aeabcaabace”和模式串“abac”,初始化P=0,遍历文本串中的每一个字符,同时根据存储的字符编码信息,来更新匹配结果,也就是状态码P。
在第一次计算完成后,状态码P=0001,根据我们上面的定义,P[0]=1即表示以这一位文本串为末尾,模式串中的第0位到第0位的字符是匹配的。
进行完一次匹配后,P左移一位,将第0位置1,同时和对应字符的编码进行&操作(即尝试匹配该字符),更新状态码P。
可以看到当状态码P=0101时,P[2]=1表示当前字符匹配了模式串p[0..2]=“aba”,P[0]=1表示当前字符匹配了模式串p[0..0]=“a”,也就是说,状态码P是能够存储多种部分匹配的结果。
继续匹配
当P=1000时,也就是说P[3]=1即匹配模式串p[0...3]=“abac”,正好找到了一个对应的匹配,而我们也可以根据此条件来判断是否已经找到了匹配。
Shift-and使用的二进制信息来编码模式串,使用位运算&来达到并行匹配字符串,利用状态码P来保存当前位的匹配结果。可以观察出算法的时间复杂度很低,如果模式串的长度不超过机器字长,其效率是非常高的。
Shift-or在这里就不多做介绍了,其原理和Shift-and类似,只不过Shift-or使用0来标识存在,同时使用|来代替&进行状态码的计算。
相关参考:
1.http://igm.univ-mlv.fr/~lecroq/string/node8.html#SECTION0080
2.http://igm.univ-mlv.fr/~lecroq/string/node14.html#SECTION00140
3.https://shanire.gitee.io/oiwiki/string/kmp/#knuth-morris-pratt
4.https://shanire.gitee.io/oiwiki/string/bm/
5.http://igm.univ-mlv.fr/~lecroq/string/node6.html#SECTION0060
6.https://baike.baidu.com/item/sunday 算法/1816405
7.http://igm.univ-mlv.fr/~lecroq/string/node5.html#SECTION0050
标签:
字符串匹配在文本处理的广泛领域中是一个非常重要的主题。字符串匹配包括在文本中找到一个,或者更一般地说
2023-04-25华纳兄弟发现品牌家族的成员HGTV今天打开了HGTV®SmartHome2023的大门,这是一座位于圣达菲的新建、家具齐
2023-04-254月27日,阔别一年的中国家电及消费电子博览会(AWE2023)即将于上海新国际博览中心开幕。作为亚洲最大的家
2023-04-25“五一”假期即将来临,大家准备好去那里游玩了吗?广东交通集团所属广贺高速这份出行指南赶紧收藏起来。
2023-04-254月24日,广东宏大(002683)融资买入3050 41万元,融资偿还2823 83万元,融资净买入226 58万元,融资余额1
2023-04-25近日,在甲子光年发布的《2023中国PaaS平台赋能实体经济转型实践研究报告》中,神州云动CloudCC作为国内唯
2023-04-25原标题:截至3月底,3324万人参加个人养老金工人日报-中工网记者李丹青人社部今天召开2023年一季度新闻发布
2023-04-254月25日,新浪财经从奇富科技(原360数科)内部人士独家获悉了一份公司总裁、CEO吴海生发布的全员信,据内
2023-04-251、软文推广营销,由企业的企划人员或广告公司的文案专员,根据自身品牌或产品的特性,结合社会热点或者故
2023-04-25财经网金融讯4月24日晚,青岛银行发布公告称,该行董事会近日收到副行长王瑜的辞职报告。王瑜因工作调动,
2023-04-25今日上市:荣旗科技、民士达
2023-04-25App4月25日消息,摩根大通首席股票策略师MarkoKolanovic认为,因市场近期的平静而买入美国股票的投资者可能
2023-04-25挖贝网4月24日,雷神科技(872190)发布2023年第一季度报告,公告显示,2023年第一季度营业收入为576,534,2
2023-04-254月24日,航亚科技(688510)融资买入20 16万元,融资偿还83 36万元,融资净卖出63 2万元,融资余额8786 25
2023-04-251、开始-运行-CMD开启命令提示符,输入netstat-a记录下命令执行后显示的IP地址。2、然后给你要知道IP地址的
2023-04-252块钱甩卖养生谷项目,恒大汽车欲彻底甩掉地产类业务,养生谷,房地产,恒大汽车,恒大集团,蔚来汽车,恒大新能
2023-04-254月25日,据玻色量子官微消息,近日,北京玻色量子科技有限公司完成了光量子测控一体机——“量枢”的研...
2023-04-25格隆汇4月25日丨广联航空(300900 SZ)发布2023年一季度报告,实现营业收入1 58亿元,同比增长51 36%;归属于
2023-04-25随着新能源、电子信息市场的下游需求与日俱增,2022年氟化工景气度持续高企。据上海证券报记者统计,截至4
2023-04-25春日来临,花满人间让人想来场惬意的旅行赏花踏青、参观景区、打卡地标福建绝美的旅游景点数不胜数预约买票
2023-04-25全球最大的家电及消费电子盛会进入倒计时,AWE2023将于4月27日至30日在上海新国际博览中心举行。由于众所周
2023-04-251、刑法第二百三十四条规定,故意伤害他人身体的,处三年以下有期徒刑、拘役或者管制。2、犯前款罪,致人重
2023-04-25今天来聊聊关于集邮11185cn,jiyou11185的文章,现在就为大家来简单介绍下集邮11185cn,jiyou11
2023-04-251、图形一般包括多个独立的形状,当需要选中、移动和修改大小时,往往需要选中所有的独立形状,操作起来不
2023-04-251、欧阳海镇是伟大共产主义战士欧阳海的故乡,位于桂阳县北部,原名沙溪公社,1964年,为纪念伟大的共产主
2023-04-251 千岛湖自驾公路路线图步骤 方式11、自驾路线:环湖全长公里数:135公里。建议游玩时间:1-2天。自驾行程
2023-04-251、在五线谱上音的位置愈高,音也愈高,反之音的位置愈低,音也愈低,但到底高多少,低多少,却无法确定。
2023-04-25关于开展2023年度徐汇区人才租房补贴工作的通知根据《徐汇区人才租房补贴实施细则(2021版)》有关规定,开展
2023-04-251、产后首先要做的就是减肥,但是一定要健康减肥,采取适当的手段保证母乳。2、只有在宝宝断奶后,才能进行
2023-04-25(记者林浩)广西壮族自治区商务厅24日数据显示,今年“三月三”假期期间,广西重点零售业、餐饮业企业实...
2023-04-251、血管造影是将造影剂直接注入血管内,使其脑血管系统显影的一种X线投影检查技术。2、通过血管造影可以具
2023-04-25青岛银行(03866)发布公告,该行董事会近日收到该行副行长王瑜的辞职报告。王瑜因
2023-04-25近日,不少消费者在社交媒体反馈称,临近“五一”假期,自己早就订好的民宿遭到民宿主“毁约”,房东要...
2023-04-25在第28个世界读书日到来之际,成都市金牛区图书馆携手成都市人民北路中学校,开展“阅读成都,热爱成都...
2023-04-252023年中药种植概念上市公司一览(4月24日),2023年中药种植概念上市公司一览(4月24日)2023年中药种植概
2023-04-25癌症并不是一朝一夕之间就会发生的。那么,到底是谁给了癌细胞“变大变强”的机会?一起来看看肿瘤医生...
2023-04-251、八百标兵奔北坡,炮兵并排北边跑,炮兵怕把标兵碰,标兵怕碰炮兵炮八百标兵奔北坡,炮兵并排北边跑。2、
2023-04-251、第一处狭窄位于食管的起始处,距离中切牙约15cm。2、食管的第二处狭窄位于食管与左主支气管交点处,距离
2023-04-254月24日,京山轻机今日跌停,龙虎榜数据显示,上榜营业部席位全天成交52亿元,占当日总成交金额比例为236%
2023-04-25我们明确的看得出来,无论是球队中非常优秀的王楚钦,又或者说是王曼昱,2位选手都分别包揽了男乒跟女乒比
2023-04-25智通财经APP讯,延江股份发布2021年第三季度报告,该公司前三季度营业收入为8 77亿元,同比减少30 87%。归
2023-04-25华泰期货指出,黑色产业链各商品价格目前尚未出现明显止跌迹象。后续来看,若多数钢厂主动减产,重新改善供
2023-04-25克林斯曼:这届德甲史上最有戏剧性这是年轻的力量
2023-04-24合盛硅业(603260):逆势扩产提高市场份额,一体化布局渐明。新闻资讯提供最新、最及时的新闻服务。包括:个股
2023-04-241、KPI(KeyPerformanceIndicator,关键绩效指标) 企业关键业绩指标(KPI:KeyPerformanceIndicator
2023-04-24关于海口至定安段高速公路扩容,海南权威部门发声!
2023-04-24期螺大幅下跌,跌幅3 61%,收盘3714。,市场恐慌情绪仍在,砸价抛售情况普遍,但有个别贸易商挺价
2023-04-24沙尔克宣布,沙尔克U17队主教练奥努尔-西内尔将于赛季末离开球队。这是矿工青训学院总监朔伯与西内尔讨论的
2023-04-24“知产”变资产,北京银行上海分行“科知贷”产品创新赋能科创企业,上海市,科知贷,中小企业,知识产权,科...
2023-04-24科尔:追梦是我见过最聪明的球员之一他与裁判对手互动都为了赢,勇士,二战,骑士团,军事条约,军事同盟,赫尔穆
2023-04-24小黄鸭德盈(02250)公布,于2023年4月24日,该公司回购256万股,斥资3
2023-04-24资深老骑手遭遇“新”问题永辉超市称配合申诉
2023-04-241、会计电算化分类:目前会计电算化已成为一门融计算机科学、管理科学、信息科学和会计科学为一体的边缘学
2023-04-24CLAUTO酷乐汽车 本田 S2000 Author 酷乐汽车经典的本田S2000是本田车迷经常挂在嘴边的车型,但是跟思域
2023-04-241、正方体的表面积是:边长×边长×6。2、用六个完全相同的正方形围成的立体图形叫正六面体,也称立方体、
2023-04-24金融界4月24日消息同花顺(行情300033,诊股)公告,一季度营业收入6 1亿元,同比增长18 42%;净利润1 22亿元
2023-04-24中新网河北新闻4月24日电(徐巧明王娟)“现在是小麦挺身和拔节的关键期,除了浇水,后期的磷酸二氢钾肥一定
2023-04-24智通财经APP获悉,在宣布离职六个月后,ChristianBluhm将继续担任瑞银(UBS US)的首席风险官,而之前指定的
2023-04-24香港屋宇署2月共批出17份建筑图则,其中港岛5份、九龙3份及新界9份。上述批出的图则包括11项住宅及商住发展
2023-04-241、没有你说的业余本科,现在成人教育分为夜大、函授、脱产,现在一类院校的脱产(也就是全日制)已经不批
2023-04-24中国网财经4月24日讯(记者叶浅单盛群)23日晚间,东方电子(000682 SZ)披露公司董事杨恒坤因个人原因被留置调
2023-04-24生化危机4重制版游戏中武器是非常重要的,玩家需要用武器击败敌人,很多玩家想知道生化危机4重制版怎么无限
2023-04-241、银鱼一般煮二十来分钟左右就熟了。2、看颜色。新鲜且优质的银鱼颜色应该是洁白如银并且透明的。看体态。
2023-04-244月23日,秦山核电在秦三厂112大修中顺利完成国内首个商用堆同位素研发平台安装、冷态调试和系统标识,标志
2023-04-244月24日消息,在刚刚过去的一周,特斯拉的股价表现并不能让股东满意,最大跌幅达13 18%,市值蒸发770亿美元
2023-04-24本网讯(记者熊家明)2023年一季度,湖北省宜昌市高新区从强化目标引领、责任包干、平台运用、问题整改、示
2023-04-24广东省2023年上半年全国大学英语四、六级考试时间安排如下:大学英语四级考试(CET4):6月17日09:00-11:20大
2023-04-24【大模型横行:不到2月10余个问世烧30亿就能炼造?激战背后机会在哪儿?】ChatGPT的火爆带动了国内对大语言
2023-04-24平安证券股份有限公司闫磊徐勇付强徐碧云近期对国联股份进行研究并发布了研究报告《国内B2B电子商务龙头紧
2023-04-24猪价阴跌不止,上市猪企的业绩“狠受伤”。4月23日晚间,天邦食品(002124 SZ)披露业绩预告修正公告,...
2023-04-24猥亵疑云:父亲称7岁女儿遭妻子朋友猥亵,涉案男子否认,警方立案后又撤案7岁女儿被确诊外阴炎、处女膜缘有
2023-04-241、按件收费收取(1)无财产争议:6000元-20000元之间;(2)法律文书:600元-2000元之间;(3)律师见证:
2023-04-24第一时间提供各大券商研究所报告,最大程度减少个人投资者与机构之间信息上的差异,使个人投资者更早的了解
2023-04-24中国农科新闻网是农业科技报社顺应网络时代新媒体发展趋势,在三农领域倾心打造的集资讯、互动、网上展示于
2023-04-244月22日消息,备受关注的芯恩,再次获得青岛国资支持。相关企业信用信息公示系统显示,3月31日,芯恩工商信
2023-04-24中国外汇交易中心最新计算的2023年4月21日CFETS人民币汇率指数为100 01,按周涨0 39%;BIS货币篮子人民币
2023-04-241、1 推断位置选择:2、准确的推断是有效窃取的前提,也是移动位置选择的基础。抢球时,防守方应分析推断进
2023-04-244月19日,湖南省张家界市桑植县委统战部、武陵源区委统战部、湖南桑植农村商业银行在武陵源区联合举办金融
2023-04-24大家好,小乐来为大家解答以上的问题。恭祝新婚红包贺词格式,恭祝新婚红包贺词这个很多人还不知道,现在让我
2023-04-24由河南广播电视台推出的“大象元”数字生态赋能平台日前在郑州正式对外发布。随着云计算、人工智能、区...
2023-04-24上周六,巴黎圣日耳曼给了球员假期,梅西在此期间秘密抵达巴塞罗那。有报道称,他本次返回家乡由最亲近的家
2023-04-241、你好,信用卡不能还款花呗,信用卡可以取现。2、取现后可以还花呗,但是利息很高,不建议这么做!而且银
2023-04-24一、题文—WhatcanIdoforyou,madam?—______ IwantakiloofapplesYoucan
2023-04-24据路透社,由于安保人员举行罢工,4月24日德国柏林机场的服务面临中断,所有出港航班都被取消,部分进港航
2023-04-24《勇者无惧》是由张丹峰、袁雨萱、李乃文、海一天、郭晋安、柏华力·莫高彼斯彻、赵儒嫣、差拉·恩萨隆...
2023-04-24以太原为主中心打造全省快递物流体系,主流媒体,山西门户。山西新闻网是经国务院新闻办审核批准,由山西日报
2023-04-24新华全媒+|“北斗精神”托举起小卫星的大未来---近年来,一颗又一颗令人瞩目的小卫星,从位于上海浦东...
2023-04-24RAM结构系统CONNECT版本2023(23 00 00092)|2 6Gb结构产品开发团队很高兴地宣布RAMStructuralSystemCONNEC
2023-04-241、反正切函数(inversetangent)是数学术语,反三角函数之一,指函数y=tanx的反函数。2、计算方法:设
2023-04-24河南广电·大象新闻记者龚雪通讯员彭帮喜为深入学习贯彻党的二十大精神,创建针对性、实效性的高质量干...
2023-04-24节能铁汉(行情300197,诊股)公告,公司拟向中节能生态、土生堃、土生堂、土生田发行股份及支付现金购买其持
2023-04-24杭州花圃的月季花杭州市园林文物局供图中新网杭州4月23日电题:杭州“一展七花园”亮相350万株月季启“...
2023-04-241、每年的3月17日是国际帆船节。2、“世界海洋日”最早出现于1978年。由于当年的3月17日是《国际海事组...
2023-04-24今天来聊聊关于狼王梦读后感400字后感,狼王梦读后感400字的文章,现在就为大家来简单介绍下狼王梦读后感40
2023-04-24一、题文第8题临时来中国采访的外国记者,发放的签证种类是( )。A.“J-1”B.“J-2”C.“L”D.“G”
2023-04-241、看你是什么池塘了,室内水泥池塘用纳米管通纯氧,适合高档鱼。2、室外土池根据水深选用叶轮式或水车式,
2023-04-246座车载16人遇查乘客溜下车躲进路边店!
2023-04-244月23日消息,中国人民银行国际司司长金中夏在发布会上表示,人民银行将不断完善以市场供求为基础,参考一
2023-04-244月20日,“悦见繁华未来为邻”城发·悦邻广场招商推介会暨商家见面会在青岛国际交流合作中心拉开帷幕,...
2023-04-23这笔交易最初由Axios报道,并在周五被乘车公司证实。Lyft没有对交易的融资发表评论。HaloCars成立于2018
2023-04-23Copyright © 2015-2022 每日水产网版权所有 备案号:浙ICP备2022016517号-15 联系邮箱:5 146 761 13 @qq.com