Interleaving String 一个月前没做出来的题目,闷了三天终于闷出来了

Interleaving String

Given s1s2s3, find whether s3 is formed by the interleaving of s1 and s2.

For example,
Given:
s1 = "aabcc",
s2 = "dbbca",

When s3 = "aadbbcbcac", return true.
When s3 = "aadbbbaccc", return false.

从开始看这道题目到最后Pass OJ,居然用了将近一个月,==!我实在是弱爆了。

做到只剩下五道题时候完完全全是“山重水复已无路”的绝境,之前遇到头痛的就扔下难的挑个相对简单的,有思路的,可是现在的情况是看哪个都是没思路。。。

其实这道题并不是“一看两眼黑”的题目,但想通过Time Limit实在是太难,==! 闷了整整三天,才在凌晨时分把这道题的DP思路闷好,然后起床开始重新写代码,最终在凌晨4:30的时候完成之前错误样本和各种小样本的测试,不过到图书馆重新OJ的时候仍然需要改动几次:==!



其实这道题最Straight forward的思路就是Recursion,但Recursion遇到String1, String2里有大量重复的字串的时候Running time就太长了,比如两串里都有一段abababab, abababab的时候,Recursion次数是以2的指数次方的形式开始增长的;  

于是改成DP动态规划,一开始还以为要弄个3D的大型魔方,但想来想去那个计算时间也不短(当然要比2^n要快很多);
于是在纸上画“手动档”解题思路:
在string1为Row,以string2为col,建立一个2D的Matrix,然后把String3当做一条“绳子”从Matrix的最左上角开始铺,如果string3.charAt(i)和matrix左边界的字符相同,则绳子可以向下走,如果string3.charAt(i)和Matrix上边界的字符相同,则绳子可以往左铺(这个比喻不太好,但我情商较低的大脑想不出更好的比喻了) 请见下图:



文本文档里显示的是两组结果,两次输入相同的string1和string2,但输入不同的string3;  
 第一组结果是 string3可以一直铺到Matrix的右下角,这样就表示string3是可以被string1 and string2 reconstruct.

第二组结果可以看出来,string3在铺到aadbbb之后就没法继续走了,最后的四个字符没办法匹配。

另外一个非常有意思的现象是,如果用DP+Matrix在少量字符输入的时候,RunningTime仍然挺多的,但在大字串的时候居然也不慢;可是在用Recursion的时候,少量字符串时可以用“光速”来形容,但在大字串输入的时候就成了龟速。


完整的原代码证见GitHub: 
Dynamic Programming with matrix: 

https://github.com/breezedu/LeetCode2012/blob/master/InterleavingStringDPwithMatrix.java


Recursion:
https://github.com/breezedu/LeetCode2012/blob/master/InterleavingStringRecursion.java 
其实我对Recursion这段非常满意,代码也相当简洁,就是running time久了点,==!

### 内存交错的概念 内存交错是一种提高存储器带宽的技术,通过并行访问多个存储模块来减少等待时间。这种技术利用了不同地址映射到不同的物理存储芯片上,使得连续的数据可以分布在这些芯片之间。当处理器请求数据时,如果采用单个大容量的RAM,则可能因为读取延迟而降低性能;但是使用多组较小容量的RAM,并且合理分配数据位置的话,就可以显著提升整体吞吐量。 具体来说,在计算机体系结构中,内存交错通常涉及到将主存划分为若干个独立但相互连接的部分——即所谓的“银行”(banks)。每个银行都有自己的控制逻辑以及与之相连的一条或多条总线用于传输指令和数据。这样做的好处是可以让CPU在一个周期内同时向多个银行发起读写操作而不必担心冲突问题[^1]。 ### 实现方式 为了有效地实施内存交错方案,硬件设计者们会考虑以下几个方面: #### 地址映射策略 最常见的是低位交叉编址法(low-order bit interleaving),它把低几位作为选择特定bank的选择信号。例如对于四路交织而言,假设我们有四个Bank0~3,那么输入地址中的最后两位决定了当访问哪一个具体的bank。这种方法简单易行,但在某些情况下可能导致局部性较差的工作负载效率低下。 另一种方法叫做高位交叉编址(high-order bit interleaving), 它则是基于较高位来进行划分。这种方式能够更好地支持程序执行过程中常见的空间局部性和时间局部性的特点,从而提高了命中率并减少了平均访问延时。 #### 控制机制 除了合理的地址映射外,还需要有效的仲裁算法来管理来自各个master端口的竞争情况。这包括但不限于轮询(round-robin)调度、优先级排队(priority queueing)等手段以确保公平性和及时响应度。 另外值得注意的是,现代高性能计算平台往往还会集成更复杂的缓存层次结构(cache hierarchy), 这些都进一步增强了系统的并发处理能力和优化了访存路径上的瓶颈环节。 ```c++ // 假设有一个简单的函数用来模拟内存交错寻址过程 uint8_t* get_memory_bank(uintptr_t address, int num_banks){ // 使用低阶位进行 bank 的选择 return &memory[(address % num_banks)]; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值