Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures 为什么在现实世界中我们需要Deque数据结构?_Data Structures_Deque - Fatal编程技术网

Data structures 为什么在现实世界中我们需要Deque数据结构?

Data structures 为什么在现实世界中我们需要Deque数据结构?,data-structures,deque,Data Structures,Deque,有人能给我举一个需要数据结构的例子吗 注意-请不要解释什么是deque?说有使用deque的作业调度算法。德语维基百科页面(http://de.wikipedia.org/wiki/Deque)提到模式匹配算法和非确定性有限状态机的实现作为DEQUE的用例。 一个可以使用deque的例子是a-Steal作业调度算法。该算法实现了多处理器的任务调度。为每个处理器维护一个单独的deque,其中包含要执行的线程。为了执行下一个线程,处理器从deque中获取第一个元素(使用“RemoveFirstEle

有人能给我举一个需要数据结构的例子吗

注意-请不要解释什么是
deque

说有使用deque的作业调度算法。德语维基百科页面(http://de.wikipedia.org/wiki/Deque)提到模式匹配算法和非确定性有限状态机的实现作为DEQUE的用例。

一个可以使用deque的例子是a-Steal作业调度算法。该算法实现了多处理器的任务调度。为每个处理器维护一个单独的deque,其中包含要执行的线程。为了执行下一个线程,处理器从deque中获取第一个元素(使用“RemoveFirstElement”deque操作)。如果当前线程分叉,则将其放回deque的前面(“前面插入元素”),并执行一个新线程。当其中一个处理器完成其自身线程的执行(即其deque为空)时,它可以从另一个处理器“窃取”线程:它从另一个处理器的deque获取最后一个元素(“删除最后一个元素”)并执行它

在最近的一篇文章中,Richter描述了.NET4.0中对ThreadPool所做的改进。这绝对值得一读,尤其是关于偷工减料的。Richter描述的算法看起来与Wikipedia中的示例非常相似,因此我怀疑Deque也在那里使用。

可以使用两种数据结构之一实现“队列”

  • 链表-如果您只在两端工作,而不关心内存分配开销(或限制如何分配内存),这是有意义的
  • deque—如果您在末端工作,则还需要位置访问(或快速遍历队列中的项的能力),并且内存分配开销很重要(但不受限制),那么deque提供了两者的最佳效果(类似于链表的函数的向量式分配——不管怎样,插入到中间的代价更高)

  • 通常情况下,deque对优先级排队很有用,使用deque扫描队列的速度明显快于链表。

    对任何类型的真实排队进行建模时:实体(位、人、车、字、粒子等)以一定的频率到达线路末端,并在线路开始时以不同的频率提供服务。在等待时,一些实体可能会决定离开线路……等等。
    关键是您需要“快速访问”来在行的两端插入/删除,因此需要deque。

    deque是一个双端队列,允许从两端插入和删除

    在真实场景中,我们可以将其连接到购票线路上,它的性能类似于队列,但有时一些人购买了票,突然他们回来询问队列前面的一些事情。在这种场景中,因为他们已经购买了票,所以他们有权来询问任何进一步的查询。所以在这种情况下,我们需要一个数据结构,根据需要,我们从前面添加数据。在相同的情况下,用户也可以从后面离开队列

    所以它完全遵循Deque的数据结构

  • deque的一个很好的应用程序是存储web浏览器的历史记录。最近访问的URL被添加到deque的前面,并且在前面插入指定次数后,deque后面的URL被删除
  • deque的另一个常见应用程序是存储软件应用程序的撤消操作列表
  • 可以使用deque的一个示例是a-STERE作业调度算法。[5]该算法为多个处理器执行任务调度。为每个处理器维护一个单独的deque,其中包含要执行的线程。要执行下一个线程,处理器从deque中获取第一个元素(使用“删除第一个元素”)deque操作)。如果当前线程分叉,它将被放回deque的前面(“前面插入元素”),并执行一个新线程。当其中一个处理器完成其自身线程的执行(即其deque为空)时,它可以从另一个处理器“偷取”线程:它从另一个处理器的deque获取最后一个元素(“删除最后一个元素”)并执行它。-维基百科提供

  • deque可以模拟火车站,在火车站中,车辆可以在线路的左侧或右侧进出,但只有末端的车辆可以进出。这是因为内侧的车辆无法撞击外侧的车辆离开,所以他们只需等待。

    链接迭代器时有一个实际使用示例。我用它来实施一项:

    import java.util.Deque;
    导入java.util.Iterator;
    导入java.util.concurrent.concurrentLinkedQue;
    公共类ExtendableTerator实现迭代器{
    public Deque its=new concurrentlinkedque();
    公共可扩展计数器(){
    }
    公共扩展迭代器(迭代器it){
    这个();
    这个。扩展(它);
    }
    @凌驾
    公共布尔hasNext(){
    //这是真的,因为我们从不持有空迭代器
    return!its.isEmpty()&&its.peekLast().hasNext();
    }
    @凌驾
    公共交通工具{
    T next=its.peekFirst().next();
    如果(!its.peekFirst().hasNext()){
    它的.removeFirst();
    }
    下一步返回;
    }
    公共void扩展(迭代器it){
    if(it.hasNext()){
    its.addLast(it);
    }
    }
    }
    
    信息:在维基百科上。加上一个“请不要解释什么是德克”“这个家伙知道StActOp溢出。程序员的复制品。SE。我不确定这是多么现实。考虑到你不能用DeQuo来模拟一个真实的世界线,除非只有最后一个人才能离开这条线。如果假设第三个家伙想要离开,那么这个假设线也行。
    import java.util.Deque;
    import java.util.Iterator;
    import java.util.concurrent.ConcurrentLinkedDeque;
    
    public class ExtendableIterator<T> implements Iterator<T> {
    
        public Deque<Iterator<T>> its = new ConcurrentLinkedDeque<Iterator<T>>();
    
        public ExtendableIterator() {
    
        }
    
        public ExtendableIterator(Iterator<T> it) {
            this();
            this.extend(it);
        }
    
        @Override
        public boolean hasNext() {
            // this is true since we never hold empty iterators
            return !its.isEmpty() && its.peekLast().hasNext();
        }
    
        @Override
        public T next() {
            T next = its.peekFirst().next();
            if (!its.peekFirst().hasNext()) {
                its.removeFirst();
            }
            return next;
        }
    
        public void extend(Iterator<T> it) {
            if (it.hasNext()) {
                its.addLast(it);
            }
        }
    }