ArrayDeque与LinkedList作为队列进行级别顺序遍历

时间:2019-06-26 07:34:48

标签: java algorithm data-structures queue

在这种情况下,not interested/logout.php优先吗? Why is ArrayDeque better than LinkedList

我认为,我应该使用LinkedList而不是ArrayDeque,因为有很多ArrayDequeLinkedList 该算法正在进行操作,并且没有对元素的随机访问。

poll

1 个答案:

答案 0 :(得分:1)

在将ArrayDequeLinkedList视为双端队列时,在LinkedListLinkedList之间做出选择时要考虑很多折衷。

通常,LinkedList类型具有以下优点:

  • 添加元素的成本是最坏情况下的O(1),因此任何单个插入都不会花费太多时间。
  • 从末端删除元素的成本是最坏的情况O(1),因此任何单个删除操作都不会花费太多时间。

通常,LinkedList类型具有以下主要缺点:

  • 由于ArrayDeque中的元素不一定连续存储在内存中,因此ArrayDeque的引用位置很差,访问可能会导致更多的缓存未命中,从而降低性能。

通常,ArrayDeque类型具有以下优点:

  • 由于元素是连续存储的,ArrayDeque的引用位置很大,因此元素访问通常将创建很少的高速缓存未命中,从而带来出色的性能。

通常,ArrayDeque具有以下缺点:

  • 尽管ArrayDeque上的n个操作的任何序列将花费时间O(n),但是当插入时超出数组容量时,LinkedList可能必须执行O(n)才能复制元素。结果,每个操作ArrayDeque的最坏情况下的性能要比ArrayDeque慢。
  • 类似地,如果删除时阵列容量下降得太低,则调整阵列大小可能需要时间O(n),尽管像以前一样,LinkedList上的任何n序列操作都将花费时间O (n)。

在您的特定用例中,由于您关心的只是级别顺序遍历的端到端效率,而不是从队列中单独添加或删除元素的成本,因此它可能会更快使用LinkedList而不是ArrayDeque。从某种意义上说,export class AppComponent implements AfterViewInit { coordinates = [ { x:10, y:10, label:'A' }, { x:10, y:250, label:'B' }, { x:250, y:250, label:'C' }, { x:250, y:150, label:'D' }, { x:400, y:150, label:'E' }, { x:400, y:10, label:'F' } ] /** Template reference to the canvas element */ @ViewChild('canvasEl') canvasRef: ElementRef; /** Canvas 2d context */ private context: CanvasRenderingContext2D; constructor() {} ngAfterViewInit() { this.setDummyRoofLayout(); } setDummyRoofLayout() { let ctx: CanvasRenderingContext2D = this.canvasRef.nativeElement.getContext( '2d' ); let ctx2: CanvasRenderingContext2D = this.canvasRef.nativeElement.getContext( '2d' ); let label: CanvasRenderingContext2D = this.canvasRef.nativeElement.getContext( '2d' ); ctx.strokeStyle = '#EE9723'; ctx.lineWidth = 2; ctx.beginPath(); ctx2.beginPath(); ctx2.fillStyle = '#EE9723'; ctx2.arc(10, 10, 10, 0, 2 * Math.PI); ctx2.fill(); ctx2.beginPath(); ctx2.arc(10, 250, 10, 0, 2 * Math.PI); ctx2.fill(); ctx2.beginPath(); ctx2.arc(250, 250, 10, 0, 2 * Math.PI); ctx2.fill(); ctx2.beginPath(); ctx2.arc(250, 150, 10, 0, 2 * Math.PI); ctx2.fill(); ctx2.beginPath(); ctx2.arc(400, 150, 10, 0, 2 * Math.PI); ctx2.fill(); ctx2.beginPath(); ctx2.arc(400, 10, 10, 0, 2 * Math.PI); ctx2.fill(); ctx.moveTo(10, 10); ctx.lineTo(10, 250); ctx.lineTo(250, 250); ctx.lineTo(250, 150); ctx.lineTo(400, 150); ctx.lineTo(400, 10); ctx.lineTo(10, 10); ctx.stroke(); label.beginPath(); label.moveTo(10, 10); label.fillStyle = 'white'; label.textAlign = 'center'; label.textBaseline = 'middle'; label.font = '.75rem Arial'; label.fillText('A', 10, 10); label.fillText('B', 10, 250); label.fillText('C', 250, 250); label.fillText('D', 250, 150); label.fillText('E', 400, 150); label.fillText('F', 400, 10); label.stroke(); ctx.canvas.addEventListener( 'click', this.onclick.bind(this) ); } onclick(e){ console.log(e); let xAxis = e.layerX ; let yAxis = e.layerY; this.coordinates.forEach(element=>{ if(element.x+4 <xAxis && element.y+4>yAxis){ alert('label A clicked'); } }) } }][1]][1] 类型通常仅在需要在每个执行的操作上都具有良好的最坏情况下的性能时才更好,而在这里不是这种情况。当您只关心端到端运行时时,{0: {'Id': 'd1', 'name': 'elpato', 'email': '122as@gmail.com'}, 1: {'Id': 'd2', 'name': 'petoka', 'email': 'sss@gmail.com'}} 通常会表现得更好。

希望这会有所帮助!